1.php 请求 getip.php 。
1.php代码:
1 $ch = curl_init(); 2 curl_setopt($ch, CURLOPT_URL, "http://localhost/2.php"); 3 curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-FORWARDED-FOR:8.8.8.8', 'CLIENT-IP:8.8.8.8')); //构造IP 4 curl_setopt($ch, CURLOPT_REFERER, "http://www.gosoa.com.cn/ "); //构造来路 5 curl_setopt($ch, CURLOPT_HEADER, 1); 6 $out = curl_exec($ch); 7 curl_close($ch);
2.php代码如下:
1 function getClientIp() { 2 if (!empty($_SERVER["HTTP_CLIENT_IP"])) 3 $ip = $_SERVER["HTTP_CLIENT_IP"]; 4 else if (!empty($_SERVER["HTTP_X_FORWARDED_FOR"])) 5 $ip = $_SERVER["HTTP_X_FORWARDED_FOR"]; 6 else if (!empty($_SERVER["REMOTE_ADDR"])) 7 $ip = $_SERVER["REMOTE_ADDR"]; 8 else 9 $ip = "无法获取IP"; 10 return $ip; 11 } 12 echo "IP: " . getClientIp() . ""; 13 echo "referer: " . $_SERVER["HTTP_REFERER"]; 14 15
这里有两点:
1.$_SERVER["REMOTE_ADDR"] 现在好像没有伪造它的方法,这要追溯到socket 获取这个地址,而这是php做不到的
2.真正的伪造ip貌似做不到的,不知道谁那么牛X,流传下来的注意的获取客户端ip的函数,不以REMOTE_ADDR ,很容易伪造ip的办法都无法防御。
获取真正ip的方法在我找的文章里:http://www.cnblogs.com/jatvsjat/articles/2688704.html
如果非得让REMOTE_ADDR改变,那就只能用代理了,curl支持代理,用上代理后REMOTE_ADDR的值就是你的代理IP值了.
小小的总结一下:
伪造的IP,最大程度上的识别请用REMOTE_ADDR来获取客户端IP
这里说的是最大程序上的,如果伪造者拥有很多代理IP,那就没话说了