实验吧-貌似有点难-http头部ip地址伪造

首先,先来看这道题的源码:

<?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”的时候,怎么做到这个呢?

再根据上面的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

解法二:

http头部中添加:Client-IP:1.1.1.1

两种方法均可顺利获取key值。

深入——怎么防止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。

参考文献:

1、https://blog.csdn.net/smilefyx/article/details/52120461

2、https://segmentfault.com/a/1190000007407810?utm_source=tag-newest

猜你喜欢

转载自my.oschina.net/u/3636678/blog/2874036
今日推荐