2012-02-17 65 views
5

我想配置我的网络中的一台机器接受来自特定机器的所有呼叫而不进行身份验证。为此,我计划使用客户端计算机的IP地址作为允许未经检查的身份验证所需的可信因素。是否有可能在java servlet中准确确定客户端的IP地址

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

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

回答

14

您可以使用HttpServletRequest类中的getRemoteAddr()方法获取IP地址。不过要小心。如果您的客户端位于代理服务器(或甚至NAT防火墙)的后面,您将获得代理IP地址。因此,您还可以查找X-Forwarded-For HTTP标头(用于标识HTTP代理之后客户端的源IP地址的标准)。查看更多关于Wikipedia。不过要小心。如果你的客户端不在代理之后,你可以得到一个空的XFF头。所以,如果你要遵循这个路径,你应该使用servlet方法和XFF头部评估的混合。但是,并不能保证代理会将您的标题转发给您。

但请注意,源IP地址可以被任何恶意客户端轻易更改或伪造。我真的推荐使用某种客户端身份验证(例如,证书)。有没有办法让一个web应用程序准确地确定的客户端IP地址。

+0

和+1表示提及XFF标题,可能性为空 – stevevls 2012-02-17 10:50:22

+0

客户端身份验证如何工作?客户端可以发送类似于https服务器发送的证书来证明自己的身份,请您提供一些相关细节。 – Ashish 2012-02-20 08:47:24

+1

您可以生成自签名客户端证书并将其安装在客户端计算机的密钥库中(您是否也在客户端使用Java?)。然后,您的服务器应该只接受来自给定CA的客户端证书(本例中为您自己)签署的请求。网上有大量有关Java +客户端证书的文档。另外,请参阅TLS上的基本知识[维基百科条目](http://en.wikipedia.org/wiki/Transport_Layer_Security)。 – Viccari 2012-02-20 11:24:27

0

IPs可以很容易伪造像电子邮件发件人我强烈建议不要单靠它们。

+0

不如邮件发件人那么容易,因为您回复了指定的IP地址。所以真正的问题是在动作的情况下推动源IP,但是当提供信息时你可以依靠它们。 – Hurda 2012-02-17 10:06:12

+1

是的,我提高了stevelvs的答案,因为他区分了写和只读。顺便说一句。邮件发件人完全一样,因为在这两种情况下您都无法收到答案。 – wintersolutions 2012-02-17 10:08:06

7

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

+0

+1用于提高读取和写入效果。 – Viccari 2012-02-17 10:15:07

+0

可否请你提供一些我如何实现所需功能的方式,即信任我的网络中的一台机器。 – Ashish 2012-02-20 08:49:45

+0

您可能想要做的一部分是决定可接受的风险水平,并将您需要锁定的周期数平衡。如果你是一家银行,那么你需要确保它坚如磐石,但其他应用程序有更大的容忍度。一种选择是确保您不受公共IP限制,并信任系统管理员以保持本地“网络锁定”。如果你真的需要保护它,如果你需要锁定它,viccaris使用客户端证书的建议是一个很好的建议。无论你做什么,如果你超越了IP验证,请确保你可以轻松撤销访问。 – stevevls 2012-02-20 23:22:51

2

您可以当地susepitable到ARP Spoofing。恶意机器说服路由器将IP地址与其MAC地址相关联。

水平和信任的机制,实际上取决于服务器/服务你想保护你在工作的环境的敏感性。

在我看来,这是考虑到私人地方安排IP地址192.168范围。如果这台服务器不是面向公众的,不是关键的,而且您正在一个相对安全的局域网环境中工作,该环境与公众和其他私人局域网关闭的很好,那么您应该可以。否则,您应该查看更高级别的其他安全选项。

+0

好点。我还没有花太多时间担心本地网络上的恶意用户,尽管它已经知道会发生并且是一个不错的主意。 :) – stevevls 2012-02-17 10:49:42

+0

192.168 ip范围不会被任何公共路由器携带。所以任何威胁都必须在内部进行 – 2012-02-17 10:52:20

1

我的问题是,是否有可能准确确定一个java servlet中的客户端的IP地址?

不,这是不可能的。由于用户的行为或用户无法控制的其他原因,您将看不到真实的客户端IP地址。

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

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