【发布时间】: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...