3

我正在开发一个系统,通过这个 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

4 回答 4

2

您用于获取 IP 的方法对于 Apache Web 服务器来说是相当标准的,但是 REMOTE_ADDR 不是唯一识别用户的可靠方法。同样正如其他人所指出的,任何“HTTP_*”标头都很容易被欺骗。

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

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

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

作为额外的奖励,如果您觉得需要,您可以将 IP 跟踪与会话结合起来,让事情变得更加强大。例如,许多应用程序通常会尝试确定用户的 IP 是否已更改,从而使会话无效。

于 2013-01-10T01:01:22.590 回答
0

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

于 2013-01-10T00:17:40.713 回答
0

我个人只会使用:

 $_SERVER['REMOTE_ADDR'].

作为

$_SERVER['HTTP_X_FORWARDED_FOR'];

更容易造假。

仅通过 IP 识别人员并不是最好的主意。它们通常很容易被有需要/想要的人伪造/躲避。

于 2013-01-10T00:19:39.823 回答
0

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

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

于 2013-01-10T00:21:10.403 回答