你还在用这种方式获得ip?(php)

Posted on 2012-12-11 15:17  gstan  阅读(138)  评论(0)    收藏  举报

最近看网上大家介绍如何获得用户的ip似乎都一直都是这样写的,

 

if (getenv ( 'HTTP_CLIENT_IP' ) && strcasecmp ( getenv ( 'HTTP_CLIENT_IP' ), 'unknown' )) { 
        $onlineip = getenv ( 'HTTP_CLIENT_IP' );
    } elseif (getenv ( 'HTTP_X_FORWARDED_FOR' ) && strcasecmp ( getenv ( 'HTTP_X_FORWARDED_FOR' ), 'unknown' )) { 
        $onlineip = getenv ( 'HTTP_X_FORWARDED_FOR' );
    } elseif (getenv ( 'REMOTE_ADDR' ) && strcasecmp ( getenv ( 'REMOTE_ADDR' ), 'unknown' )) { 
        $onlineip = getenv ( 'REMOTE_ADDR' );
    } 

$_SERVER['REMOTE_ADDR']; //访问端(有可能是用户,有可能是代理的)IP
$_SERVER['HTTP_CLIENT_IP'];   //代理端的ip
$_SERVER['HTTP_X_FORWARDED_FOR']; //用户是在哪个IP使用的代理

然而 HTTP_CLIENT_IP, HTTP_X_FORWARDED_FOR 是非常容易伪造的,

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://shuai.com:81/index.php');
curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-FORWARDED-FOR:8.8.8.8', 'CLIENT-IP:8.8.8.8'));
curl_setopt($ch, CURLOPT_HEADER, 1); 
$out = curl_exec($ch);
curl_close($ch);

  

根据上面的获取ip的逻辑,通过curl轻松伪造了用户的ip,服务端获得ip即是 8.8.8.8;

REMOTE_ADDR是服务器和客户端握手后建立的tcp连接的数据帧里的,在应用层是无法修改的。虽然不是绝对不可以伪造,但是难度确增加很多。

 

所以较简单的获得ip 的方法就是简单获取 REMOTE_ADDR的值即可

 

 

博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3

fish的博客