是否可以准确地确定java servlet中客户端的IP地址

我想在我的网络中配置一台机器,以接受来自特定机器的所有呼叫而无需身份validation。 为此,我计划使用客户端计算机的IP地址作为所需的信任因素,以允许未经检查的身份validation。

我担心的是,是否可以准确地确定java servlet中客户端的IP地址? 我可以通过一些黑客机制来改变我在servlet中获得的IP,使我的服务器相信它是可靠的IP吗?

例如,如果我的服务器计算机配置为信任192.168.0.1,那么192.168.0.1以外的其他客户端是否可以假装为192.168.0.1并欺骗我的身份validation机制?

您可以使用HttpServletRequest类中的getRemoteAddr()方法来获取IP地址。 但要小心。 如果您的客户端位于代理服务器(甚至是NATting防火墙)之后,您将获得代理IP地址。

因此,您还可以查找X-Forwarded-For HTTP标头(用于标识HTTP代理后面的客户端的源IP地址的标准)。 在Wikipedia上查看更多信息。 但要小心。 如果您的客户端不在代理服务器后面,您可以获得一个空的XFF标头。 因此,如果要遵循此路径,则应混合使用servlet方法和XFF标头评估。 但是,无法保证代理会转发您的标头。

但请注意,任何恶意客户端都可以轻松更改或伪造源IP地址。 我真的建议使用某种客户端身份validation(例如证书)。 Web应用程序无法准确确定客户端IP地址。

您的服务可能容易受到IP欺骗的影响 。 伪造看起来来自不同IP地址的数据包很容易。 但是,关于欺骗的事情是攻击者将无法接收任何响应数据包。 因此,如果调用您的服务不会导致内部状态更改(即它只读 ),那么您应该没问题。 但是,如果对您的服务的调用将发出写入 ,那么您不应仅仅依赖IP地址,因为欺骗的数据包足以改变系统的内部状态。

你可以在本地susepitable ARP Spoofing 。 恶意计算机诱使路由器将IP地址与其MAC地址相关联。

信任的级别和机制实际上取决于您尝试保护的服务器/服务的敏感性以及您正在操作的环境。

在我看来,这是一个本地安排,给定私有IP地址192.168范围。 如果这个服务器不是面向公众的,并不重要,而且您在一个相对安全的局域网环境中运行,该环境与公共局域网和其他私有局域网完全隔离,那么您应该没问题。 否则,您应该在更高级别查看其他安全选项。

我担心的是,是否可以准确地确定java servlet中客户端的IP地址?

不,这是不可能的。 在许多情况下,由于用户的操作或用户无法控制的其他原因,您将看不到真实的客户端IP地址。

在后一种情况下,基于IP的识别最终会导致您的诚实客户头疼; 即你真正想要保留的客户。

如果您确实需要限制对特定计算机集的访问,则应考虑使用SSL / TLS等客户端证书作为您的第一道防线。 此处描述了具有客户端证书的TLS。

IP很容易像电子邮件发件人一样伪造,我强烈建议不要单独依赖它们。