2016-08-01 110 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 
?>