PHP获取用户IP地址,真的可靠吗?

3

我正在开发一个系统,用户通过他们的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地址是否真的很安全。我没有处理信用卡号码或钱,所以系统不必非常安全,但如果这个脚本很容易被黑客攻击,那可能会导致问题。感谢任何帮助。


3
你只使用IP地址来标识用户,是否有原因? - Ryan Matthews
2
IP地址并不是识别用户的可靠方式。如果有两个用户从同一网络访问您的网站怎么办?如果用户通过匿名代理服务(如Tor)访问您的网站呢? - Will Vousden
4个回答

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是否已更改,并因此使会话无效。

0

个人而言,我只会使用:

 $_SERVER['REMOTE_ADDR'].

作为

$_SERVER['HTTP_X_FORWARDED_FOR'];

伪造起来要容易得多。

仅通过IP地址识别人并不是最好的想法。通常情况下,只要有需要或愿望的人都可以轻松地伪造或规避它们。


0

REMOTE_ADDR 本身是我个人认为最好的选择。任何带有 HTTP 前缀的 $SERVER 变量都可以被客户端更改,因此您不应该真正信任它。尽管如此,一些代理会在 HTTP_X_FORWARDED_FOR 标头中转发用户的真实 IP。


但问题是,当我使用 $_SERVER['REMOTE_ADDR'] 时,我得到的是我的服务器地址而不是用户的地址... 不知道为什么... - DomingoSL
奇怪。假设这是由于Ajax,但这不应该有影响,因为请求是从客户端发送的o.o向我展示你如何使用代码 :) - Prash

0

你的组合相当标准(我们用它来进行基于IP的电子订阅检查),尽管其他人已经指出它并不完美。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接