少用但始终都会碰到 - 获取真实IP ¶
作者:KK
发表日期:2017.3.30
通常来说直接获取$_SERVER['REMOTE_ADDR']
就行了 ¶
关于伪造IP ¶
有言论认为IP是可以伪造的,虽然我不懂底层的东西,但经过多年的求证,一般情况下确实是取$_SERVER['REMOTE_ADDR']
就行了
如果IP可以伪造,为什么黑客要抓肉鸡来代替他发起攻击?为什么要找跳板、为什么要找代理?
在我的理解,之所以不能伪造,是因为:
假如A
的真实IP是200.200.200.200,但他发送给B的请求报文将IP故意填错成C的200.200.200.254
B
收到了一个来自于C的200.200.200.254的报文,并作出响应,可是根据TCP/IP协议,硬件的工作规则就是:来的是什么IP,那就回复给哪个IP;肯定不会说报文标注来的IP是254但又将数据包给200
于是B将数据发给了C
,但作为欺骗者的A(200.200.200.200)根本无法收到回来的数据作进一步的处理
所以A
在发起请求时填写一个不真实的IP已经变得毫无意义,最后C
就会莫名奇妙地收到了数据
而且B
收到请求后,应该要进行握手才对,握手过程中发确认数据给C
,可是C
应该会不理会这个请求,因为C
知道自己并没有发出建立握手连接的请求
如果请求端使用了代理就麻烦了 ¶
上网找PHP获取真实IP
会有许多不同版本的代码版本,有优先获取HTTP_CLIENT_IP
的也有优先获取HTTP_X_FORWARDED_FOR
的
其实我自己也不知道哪个才是对的,但这里大家都有一个共识:HTTP_CLIENT_IP
和HTTP_X_FORWARDED_FOR
都可以被伪造
相关文章请参考《HTTP请求头与SERVER数组》和CSDN文章《php如何获取真实IP》
如果是均衡负载的部署架构,一般都会有一台前端服务器,收到请求后通过代理转发给后面的业务机器(比如nginx转发给apache),这时候也会带上HTTP_X_FORWARDED_FOR,此时可以放心获取HTTP_X_FORWARDED_FOR,因为这个代理里的信息是前端服务器转发过去的
而如果真实用户使用代理直接请求到服务器的话我也不知咋处理合适,可能被伪造的IP你信不信
如果你有什么高见,希望在此回复交流!