curl 如何模拟remote_addr 取的ip

通常获得ip 是 $ip = $_SERVER["REMOTE_ADDR"];
或者用
这个函数

  
function getClientIp() {
if (!empty($_SERVER["HTTP_CLIENT_IP"]))
$ip = $_SERVER["HTTP_CLIENT_IP"];
else if (!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
$ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
else if (!empty($_SERVER["REMOTE_ADDR"]))
$ip = $_SERVER["REMOTE_ADDR"];
else
$ip = "err";
return $ip;
}

这里有段curl 写的位置客户端Ip 的代码

  
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.test.com/2.php");
curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-FORWARDED-FOR:8.8.8.81', 'CLIENT-IP:8.8.8.82')); //构造IP
curl_setopt($ch, CURLOPT_REFERER, "http://www.xssxss.com/ "); //构造来路
curl_setopt($ch, CURLOPT_PROXY , "60.30.113.232:80");
curl_setopt($ch, CURLOPT_HEADER, 1);
$out = curl_exec($ch);
curl_close($ch);

这断的代码只能模拟 HTTP_CLIENT_IP 还有 HTTP_X_FORWARDED_FOR , 请问怎么模拟 REMOTE_ADDR ??????

那我在问一句,如果真的没办法模拟的话, 我们获取ip 的时候 为什么不用
$ip = $_SERVER["REMOTE_ADDR"]; 而很多人都喜欢去用 我上面写的那个函数呢getClientIp()

tarfly
编辑于2012-02-09
评论 (2)链接2012-02-08 
  • 0 支持
    php 模拟 REMOTE_ADDR 应该做不到哇。。期待高手解决。。 – 冯义军 2012-02-08
  • 0 支持
    $_SERVER["REMOTE_ADDR"]取客户端IP,有可能取得的是代理服务器的地址,而不是真正的客户端IP。而HTTP_CLIENT_IP和HTTP_X_FORWARDED_FOR 都可以被模拟,而且可能是代理服务器的。这里应该只是一个遍历,能找到一个就好。 – 王辉 2012-02-09

我来说说,你贴的获取IP代码是错误的PHP代码,php程序员很少涉及底层的东西,所以这种错误代码才会在php界里流传。你给的那段代码有很大的安全隐患,很容易被用来刷票,伪造IP等。很多php写的程序里正是错误地用了你的那段代码来判断IP,导致安全隐患。当然,你的CURL正是利用了这个漏洞。

  
获取IP只需要一句话,$_SERVER["REMOTE_ADDR"]这就足够了,没必要也不应该获取代理IP地址,REMOTE_ADDR是服务器和客户端握手后建立的tcp连接的数据帧里的,在应用层是无法修改的。当然,也不是绝对没有办法伪造的,IP协议可以完全自定义传输的数据,路由器这层也能伪造,但对于WEB程序员来说,是底层的东西,无法修改和伪造的。
该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (1)链接 • 2012-02-26
  • 0 支持
    你看看康盛的所有产品是不是都用那个方面做的 – tarfly 2012-02-27

REMOTE_ADDR是服务器和客户端握手后建立了tcp连接,根据socket中的ip赋值的。协议底层决定的,应该没法伪造。

该答案已被锁定,无法对其进行评论,编辑及投票。
()
评论 (0)链接 • 2012-02-08
德问是一个专业的编程问答社区,请 登录注册 后再提交答案