PHP检索用户ip,真的可靠吗?

时间:2013-01-10 00:15:17

标签: php javascript jquery ip

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

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地址。我不处理信用卡号码或金钱,所以系统不需要超级安全,但如果这个脚本非常容易破解,那么无论如何都可能是一个问题。谢谢你的帮助。

4 个答案:

答案 0 :(得分:2)

用于获取IP的方法对于Apache Web服务器来说是非常标准的,但REMOTE_ADDR不是唯一标识用户的可靠方法。正如其他人所指出的那样,任何'HTTP_ *'标题都很容易被欺骗。

最大的问题是通过IP地址识别用户只是一个明显的问题,通常你不会在你期望看到很多用户的大型系统中这样做。我可以想到几个崩溃的情况:

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

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

作为额外的奖励,您可以将IP跟踪与会话相结合,以便在您感到需要时使事情更加强大。例如,许多应用程序通常会尝试确定用户的IP是否已更改,并因此使会话无效。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我个人只会使用:

 $_SERVER['REMOTE_ADDR'].

作为

$_SERVER['HTTP_X_FORWARDED_FOR'];

假装更容易。

仅通过IP识别人员并不是最好的选择。对于有需要/想要的人来说,他们通常很容易被假装/躲闪。

答案 3 :(得分:0)

您的组合是相当标准的(我们将其用于基于IP的电子订阅检查),但其他人已经注意到它并不完美。

请注意,可以为HTTP_X_FORWARDED_FOR指定多个转发IP;有关详细信息,请参阅http://en.wikipedia.org/wiki/X-Forwarded-For#Format