2016-08-01 114 views
-5

我有一个PHP脚本竞赛,基于投票。从一个知识产权来看,一个人可以一次投票给某个人。我有投票的所有IP地址的日志,但我看到一些奇怪的东西。有些IP地址看起来像=“ip_address:port”,而另一些只是ip_address,我看到一个ip地址格式化为=“...”似乎有多次,只是有不同的端口。有人可以向我解释吗?用户如何做到这一点,我是否应该禁止他们参与竞争?在PHP中的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所有预定义变量,请与我分享。

+5

只有*** ***一个远程IP的可靠来源:'REMOTE_ADDR'。其他的一切都由HTTP标头设置,任何人都可以根据自己的喜好设置,从而完全规避您的“保护”。你通过查看所有这些随机的HTTP标题来拍摄自己的脚。您看到的“怪异值”可能来自其中一个标题。 – deceze

+1

如果您有反向代理或负载均衡器,请仅检查代理或负载均衡器设置的特定标头,并且只有信任标头特别来自代理或负载均衡器。 –

+1

PHP中的所有超全局http://php.net/manual/en/language.variables.superglobals.php – Dave

回答

0

IP地址HTTP头可能很容易被欺骗,并且很多用户(主要是移动用户,例如wifi连接)都有非常短的IP地址的租用时间,从而使他们能够再次投票。

也就是说,你可以结合选项,例如检查IP地址设置一个cookie,使其难以避开。

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

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

如果你真的想要一个公平的投票系统,允许每人一票,你需要使用别的东西,然后使用IP地址来识别用户。

+0

*“IP地址很容易被欺骗”* - 作为一般性陈述是错误的,需要更多的澄清可以接受的。 – deceze

+0

好点让我重述一下。 – saekort

0

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

<?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 
?>