【问题标题】:IP addresses in PHPPHP中的IP地址
【发布时间】:2016-12-06 16:27:15
【问题描述】:

我有一个用 PHP 编写的竞赛,基于投票。从一个IP,一个人可以为某人投票一次。我有所有投票的 IP 地址的日志,但我看到了一些奇怪的东西。有些 IP 地址看起来像 for="ip_address:port",而另一些只是 ip_address,我看到一个用 for="..." 格式化的 ip 地址似乎多次出现,只是端口不同。有人可以向我解释一下吗?用户如何做到这一点,我应该禁止他们参与竞争吗?

我使用这个函数来获取用户IP地址:

function get_client_ip_env() {
    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;
}

另外,如果有人知道 PHP 中所有预定义变量的一些很好的参考和手册,请与我分享。

【问题讨论】:

  • 远程IP只有一个可靠来源:REMOTE_ADDR。其他一切都由 HTTP 标头设置,任何人都可以根据自己的喜好设置,从而完全绕过您的“保护”。查看所有这些随机的 HTTP 标头,您是在自找麻烦。您看到的“奇怪值”可能来自这些标题之一。
  • 如果您有反向代理或负载均衡器,请仅检查代理或负载均衡器设置的特定标头,并且仅当标头特别来自代理或负载均衡器时才信任该标头。
  • PHP 中的所有超级全局变量 php.net/manual/en/language.variables.superglobals.php
  • 移动网络上的人可能每隔几分钟就更换一次 IP 地址。
  • ...一个大型 NAT(例如企业内部网)背后的许多人都将共享一个 IP...

标签: php ip


【解决方案1】:

IP 地址 HTTP 标头很容易被欺骗,而且很多用户(主要是移动用户,例如 wifi 连接)对 IP 地址的租用时间非常短,因此他们可以再次投票。

也就是说您可以组合选项,例如检查 IP 地址和设置 cookie 以使其更难绕过。

如果您使用 IP 地址设置端口,那么它将与您的数据库记录/IP 地址列表不匹配。你应该为此禁止他们吗?我无法回答。

您的大多数检查方法都是基于请求所说的 IP 地址,例如很容易被欺骗的 HTTP 标头。不要相信他们或接受你的民意调查不会得到准确的结果。

如果您真的想要一个允许每人一票的公平投票系统,您将需要使用其他东西而不是 IP 地址来识别用户。

【讨论】:

  • “IP 地址很容易被欺骗”——一般性陈述是错误的,需要进一步澄清才能被接受。
【解决方案2】:

试试这个,它可能对你有帮助

 <?php
 //for example
     $ip = "216.58.196.68:8989";
     $ip = strstr("$ip",':',true); //get text before :   
     echo $ip;
//it echo only 216.58.196.68
?>

【讨论】:

    猜你喜欢
    • 2012-08-26
    • 2013-03-31
    • 2011-02-07
    • 2012-02-29
    • 2015-06-01
    • 2010-12-15
    • 2023-04-07
    • 2013-08-22
    • 1970-01-01
    相关资源
    最近更新 更多