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

首先,先来看这道题的源码: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

相关文章
相关标签/搜索