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

时间:2012-02-17 09:56:30

标签: java authentication networking ip

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

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

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

5 个答案:

答案 0 :(得分:17)

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

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

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

答案 1 :(得分:7)

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

答案 2 :(得分:2)

您可以在ARP Spoofing本地购买。恶意机器诱使路由器将IP地址与其MAC地址相关联。

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

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

答案 3 :(得分:1)

  

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

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

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

如果您确实需要限制对特定计算机集的访问,则应考虑使用SSL / TLS和客户端证书之类的东西作为您的第一道防线。带有客户端证书的TLS描述为here

答案 4 :(得分:0)

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