【问题标题】:PHP retrieving user ip, is really reliable?PHP检索用户ip,真的靠谱吗?
【发布时间】:2012-12-24 07:13:36
【问题描述】:

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

【问题讨论】:

  • 您是否有理由只使用 IP 来识别用户?
  • IP 地址不是识别用户的可靠方式。如果您有两个用户从同一个网络访问您的站点怎么办?如果用户通过 Tor 等匿名代理服务访问您的网站怎么办?

标签: php javascript jquery ip


【解决方案1】:

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

最大的问题是,通过 IP 地址来识别用户是很容易出现问题的,通常您不会在希望看到大量用户的大型系统中这样做。我能想到几种情况会崩溃:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 但问题是,当我使用 $_SERVER['REMOTE_ADDR'] 时,我得到的是我的服务器地址,而不是用户地址......不知道为什么......
    • 很奇怪。假设是因为 Ajax,但这无关紧要,因为请求是从客户端发送的 o.o 告诉我你是如何使用代码的 :)
    【解决方案3】:

    我个人只会使用:

     $_SERVER['REMOTE_ADDR'].
    

    作为

    $_SERVER['HTTP_X_FORWARDED_FOR'];
    

    更容易伪造。

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

    【讨论】:

      【解决方案4】:

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

      请注意,可以为 HTTP_X_FORWARDED_FOR 指定多个转发 IP;详情请见http://en.wikipedia.org/wiki/X-Forwarded-For#Format

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-04
        • 1970-01-01
        • 1970-01-01
        • 2010-12-08
        • 2011-06-08
        • 2011-07-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多