您的位置:首页 > 编程语言 > PHP开发

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

2012-12-11 15:17 176 查看
最近看网上大家介绍如何获得用户的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的值即可
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: