【问题标题】:What's the most reliable method of obtaining the user's IP address?获取用户IP地址最可靠的方法是什么?
【发布时间】:2018-03-19 01:25:10
【问题描述】:

几个月来我一直在使用$_SERVER["REMOTE_ADDR"] 获取用户的IP 地址。最近,我注意到这个值有时可能包含代理服务器 IP 而不是用户的 IP,这对我来说用处不大。 (我在更新到 PHP 7.1.0 后注意到了这个问题,虽然我尝试降级到以前的 PHP 版本,结果是一样的)。

我已经阅读了大量的 SO 问题,其中大多数只解决了这个问题而没有解决方案,或者提供以下功能作为解决方案:

function get_ip() {
    $ipaddress = '';
    if (getenv('HTTP_CLIENT_IP'))
        $ipaddress = getenv('HTTP_CLIENT_IP');
    else if(getenv('HTTP_X_FORWARDED_FOR'))
        $ipaddress = getenv('HTTP_X_FORWARDED_FOR');
    else if(getenv('HTTP_X_FORWARDED'))
        $ipaddress = getenv('HTTP_X_FORWARDED');
    else if(getenv('HTTP_FORWARDED_FOR'))
        $ipaddress = getenv('HTTP_FORWARDED_FOR');
    else if(getenv('HTTP_FORWARDED'))
        $ipaddress = getenv('HTTP_FORWARDED');
    else if(getenv('REMOTE_ADDR'))
        $ipaddress = getenv('REMOTE_ADDR');
    else
        $ipaddress = 'UNKNOWN';

    return $ipaddress;
}

这也是不可靠的,因为这些不同的变量可以被欺骗。

是否有任何好的可靠的解决方案来获取正确的用户 IP 地址而不是任何中间代理服务器的地址?

【问题讨论】:

  • 为什么要对客户端 IP 感兴趣?我知道这不是这里的问题,当然。我只想提一下这一点,因为通常这表明某种形式的简单授权方案提供了虚假的安全希望......
  • 我将它用于简单的投票系统,以确保人们不会投票两次。这不是为了严肃的事情,cookie 对我来说不是一个选项。
  • 这完全不可靠!许多系统使用动态 IP 地址。还有代理之类的东西。

标签: php ip clientip


【解决方案1】:

在下面使用这个函数;

   function checkIPAddress()
   {
      // Get IP Address using $_SERVER['REMOTE_ADDR'];
      $ipaddress = ($_SERVER('REMOTE_ADDR')) ? $_SERVER('REMOTE_ADDR') : '';

       if ( filter_var ($ipaddress, FILTER_VALIDATE_IP) == false)
       {
          //Log bad IP attempt
       }
       else{
          //Received valid IP Address, run next code here.
       }
       
   }

允许 HTTP_X_FORWARDED 是一个坏习惯。在做代理服务器、负载均衡或必要时使用它。

【讨论】:

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