PHP检索用户ip,真的很可靠


PHP retrieving user ip, is really reliable?

我正在开发一个用户通过他们的IP地址识别的系统,通过这个php脚本:

function visitorIP()
{ 
    if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
        $TheIp=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }else{
        $TheIp=$_SERVER['REMOTE_ADDR'];  
    } 
    return trim($TheIp);
}
$ip = visitorIP();

我想知道这是否是一个真正安全的方式来检索ip地址。我不处理信用卡号码或钱,所以系统不需要超级安全,但如果这个脚本是非常容易破解,这可能是一个问题。谢谢你的帮助。

用于获取IP的方法对于Apache web服务器来说是相当标准的,但是REMOTE_ADDR并不是唯一标识用户的可靠方法。另外,正如其他人注意到的那样,任何'HTTP_*'头都很容易被欺骗。

最大的问题是,通过IP地址识别用户是有问题的,通常你不会在一个你希望看到很多用户的大型系统中这样做。我能想到几种情况下它会崩溃:

  • 典型路由器后面有多个用户的家庭网络。路由器后面的所有计算机/设备将来自同一个IP。
  • 在负载均衡器后面设置程序,将请求转发到PHP服务器。REMOTE_ADDR将是负载均衡器的IP。
  • 通过代理服务来的用户都将具有与代理服务器相同的IP。
  • isp通常使用DHCP为客户分配IP地址。虽然不太可能,但在理论上,如果DHCP租约到期/更新,用户的IP地址可能会在会话中间更改。

使用会话可能会更好地处理您的情况。第一次看到用户时,给他们分配一个会话令牌,而不是使用他们的IP地址,并确保在后续请求中传递令牌(通过cookie或HTTP请求的一部分)。当您获得令牌时,您可以相当确信它是同一个用户(尽管存在嗅探攻击)。

作为一个额外的好处,你可以结合IP跟踪与会话,使事情更健壮,如果你觉得需要。例如,许多应用程序通常会尝试找出用户的IP是否已经更改,并因此使会话无效。

REMOTE_ADDR本身是你最好的选择。任何带有HTTP前缀的$SERVER变量都可以被客户端更改,因此您不应该真正信任它。虽然,有些代理会在HTTP_X_FORWARDED_FOR报头中转发用户的真实IP。

我个人只会使用:

 $_SERVER['REMOTE_ADDR'].

$_SERVER['HTTP_X_FORWARDED_FOR'];

更容易伪造。

仅在ip上识别用户并不是最好的主意。他们通常很容易被有需要/想要的人欺骗/逃避。

您的组合是相当标准的(我们将其用于基于ip的电子订阅检查),尽管正如其他人指出的那样,它并不完美。

注意,可以为HTTP_X_FORWARDED_FOR指定几个转发ip;