首先,先来看这道题的源码:php
<?php function GetIP(){ if(!empty($_SERVER["HTTP_CLIENT_IP"])) $cip = $_SERVER["HTTP_CLIENT_IP"]; else if(!empty($_SERVER["HTTP_X_FORWARDED_FOR"])) $cip = $_SERVER["HTTP_X_FORWARDED_FOR"]; else if(!empty($_SERVER["REMOTE_ADDR"])) $cip = $_SERVER["REMOTE_ADDR"]; else $cip = "0.0.0.0"; return $cip; } $GetIPs = GetIP(); if ($GetIPs=="1.1.1.1"){ echo "Great! Key is *********"; } else{ echo "错误!你的IP不在访问列表以内!"; } ?>
便是不懂PHP语言,也能看出来代码的意思是若是IP是“1.1.1.1”,name就能获取key值。因此,在咱们ip不是“1.1.1.1”的时候,怎么作到这个呢?segmentfault
再根据上面的GetIP()代码提示,判断咱们IP会通过三步,首先检测是HTTP_CLIENT_IP,它对应的是header中的client-ip,而后是HTTP_X_FORWARDED_FOR,它对应的header中的x-forwarded-for,服务器端HTTP_X_FORWARDED_FOR = clientip,proxy1,proxy2其中的值经过一个 逗号+空格 把多个IP地址区分开, 最左边(client1)是最原始客户端的IP地址, 代理服务器每成功收到一个请求,就把请求来源IP地址添加到右边。服务器
最后检测的是REMOTE_ADDR,这个参数不是客户端可以操做的参数,它属于TCP/IP的网络层的东西,因此很难伪造(但不是不能够呀,中转器中好比路由器中是能够实现的)。可是!!!前面都是客户端提交http请求的头部的内容啊,是能够伪造的,因此此题就迎刃而解了。网络
解法一:负载均衡
http头部中添加:X-forwarded-for:1.1.1.1.net
解法二:代理
http头部中添加:Client-IP:1.1.1.1code
两种方法都可顺利获取key值。blog
深刻——怎么防止IP伪造呢?ip
既然这么轻松就能够伪造IP地址了,服务器经过什么方法获取真实客户端IP呢,REMOTE_ADDR虽然难以伪造,是服务器根据客户端ip指定的,表明了真实的客户端IP,可是通过代理服务器,或者负载均衡,CDN等设备以后,到达服务器,服务器会把REMOTE_ADDR值设为这些中转设备的ip,此时服务器就失去了真实的ip了。HTTP_CLIENT_IP 在通过代理后,也表明了代理服务器IP。
此时想到能够在转发时主动将X-forwarded-for配置为正确的ip地址,将REMOTE_ADDR的值赋值给X-forwarded-for,这样在离开了客户端以后,便保存了真实的客户端ip。
参考文献:
一、https://blog.csdn.net/smilefyx/article/details/52120461
二、https://segmentfault.com/a/1190000007407810?utm_source=tag-newest