今晚,用curl进一个网站发现ip被限制访问了,然后我又开始了百度伪造请求ip的方法
关于php获取ip的函数 http://www.php20.cn/article/sw/ip/77
php一般用3个参数去判断ip
X_FORWARDED_FOR:获取http请求头X_FORWARDED_FOR属性
HTTP_CLIENT_IP : 获取http请求头ip CLIENT-IP属性
REMOTE_ADDR :与服务器握手的客户端ip
理解了这3个参数之后,我百度了下curl伪造ip
然后我访问自己的网站的以下代码(本地局域网访问),
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type:application/json; charset=utf-8;X-FORWARDED-FOR:111.222.333.4', 'CLIENT-IP:111.222.333.4'));
//上面这行是curl的,懒得写全,毕竟不在同一个文件
echo getenv('HTTP_CLIENT_IP');
echo getenv('HTTP_X_FORWARDED_FOR');
echo getenv('REMOTE_ADDR');
复制
运行结果如下
不难发现,REMOTE_ADDR 是正确的ip,该ip是tcp协议握手时的客户端ip,是不能伪造的 而X_FORWARDED_FOR已经是返回了自定义的值
总结以下:
用户的真实ip是无法伪造的,因为不管怎么样,都得建立tcp连接,
除非不建立tcp连接,直接经过tcp第一次握手返回一个错误的ip,不接受服务器的返回数据,这样才可以伪装一次tcp握手请求,
在正常的一次tcp连接,ip永远无法被伪造,如果没有ip,tcp连接将不成立,服务器将无法与客户端建立连接,无法发送和获取客户端的数据
在这结论之中,移动端关于使用数据流量时,虽然能获取到用户的真实ip,但这个ip,是手机与运营商基站建立连接之后,运营商给基站不定时分配的ip,只要是用户连接上了这个基站,那么所有连接这个基站的用户ip都会相同
再然后,由于REMOTE_ADDR是获取握手ip,如果使用跳板(代理服务器.服务器设定的cdn等)访问,则获取到的是代理服务器和cdn节点服务器的真实ip,而非用户的真实ip,至于用户的真实ip,代理服务器,和cdn节点是可以获取的
有人可能会问,那用户通过跳板访问,能获取到真实ip吗?
答案是不行的,除非跳板做好事,给服务器返回客户端的真实ip;一般跳板会用http头的X-FORWARDED-FOR属性进行返回用户的真实ip,而会不会返回,这就是跳板的问题了
总而言之,只要经过tcp握手成功后,都不可能伪装ip,只能说通过跳板去变动ip,而这个变动ip,也是不能自定义的,这个ip也是ip协议上一个合法的ip
评论(0)