最近看网上大家介绍如何获得用户的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的值即可
浙公网安备 33010602011771号