标签归档:remote

由request.getRemoteAddr()所想到的ip欺骗

跟一同事讨论,使用request.getRemoteAddr()来作为权限判断的安全程度,于是想知道是否可以通过ip欺骗来绕过。开始的时候先查找在http请求头部会不会出现ip的信息,结果证实是不会出现的。然后又再再看一下request.getRemoteAddr()方法是如何实现的,结果是j2ee只提供了接口,具体实现是由相应的容器来完成的。那我就推断这个ip地址是从ip包的source来的。

那我在传送http请求的时候,是否可以来更新source ip 来完成欺骗呢?如果你不在意对方的响应,是可以这样做的。黑客进行的DoS攻击就是这样来完成的。但我们模拟请求,当然想得到一些数据,但你把source ip给修改了,返回的信息是不会到你这台服务器上的,所以具体实现也是很难的。

那么这样说来这种方法做作权限验证是安全的?也不全对,如果是独立ip地址的服务器,中间不经过任何的反向代理,是安全的。如果你使用了一些框架,又没有反向代理,这种就不太安全了。经过反向代理服务器的时候由于转发时候会把source ip改成代理服务器的ip地址,所以你直接获取request.getRemoteAddr()是不一定能获得客户端的地址,于是代理服务器会在头部加上X-Forward-For的信息,来标识原始服务器的ip信息,框架会先判断是否有X-Forward-For,如果有则以X-Forward-For为准。如果这时你没有使用代理服务器,而框架又做了如此判断,就可以在header中增加X-Forward-For来作ip欺骗,完成从非法到合法的转变