我一直在使用$_SERVER["REMOTE_ADDR"]
获取用户的IP地址数月。最近,我注意到这个值有时可能包含代理服务器IP而不是用户的IP,这对我来说没什么用处。 (我在更新到PHP 7.1.0之后注意到了这个问题,虽然我已经尝试降级到以前的PHP版本并且结果相同)。
我已经阅读了大量的SO问题,其中大多数只是在没有解决方案的情况下解决了这个问题,或者提供以下功能作为解决方案:
function get_ip() {
$ipaddress = '';
if (getenv('HTTP_CLIENT_IP'))
$ipaddress = getenv('HTTP_CLIENT_IP');
else if(getenv('HTTP_X_FORWARDED_FOR'))
$ipaddress = getenv('HTTP_X_FORWARDED_FOR');
else if(getenv('HTTP_X_FORWARDED'))
$ipaddress = getenv('HTTP_X_FORWARDED');
else if(getenv('HTTP_FORWARDED_FOR'))
$ipaddress = getenv('HTTP_FORWARDED_FOR');
else if(getenv('HTTP_FORWARDED'))
$ipaddress = getenv('HTTP_FORWARDED');
else if(getenv('REMOTE_ADDR'))
$ipaddress = getenv('REMOTE_ADDR');
else
$ipaddress = 'UNKNOWN';
return $ipaddress;
}
这也是不可靠的,因为这些不同的变量可能是欺骗性的。
是否有任何良好可靠的解决方案来获取正确的用户IP地址而不是任何中间代理服务器?
答案 0 :(得分:0)
function checkIPAddress()
{
// Get IP Address using $_SERVER['REMOTE_ADDR'];
$ipaddress = ($_SERVER('REMOTE_ADDR')) ? $_SERVER('REMOTE_ADDR') : '';
if ( filter_var ($ipaddress, FILTER_VALIDATE_IP) == false)
{
//Log bad IP attempt
}
else{
//Received valid IP Address, run next code here.
}
}
允许HTTP_X_FORWARDED是一个坏习惯。在进行代理服务器,负载平衡或必要时等时使用它。