2011-01-24 17 views
4

我正在研究一個允許用戶對某些項目進行投票的PHP腳本。任何用戶登錄或不能投票。考慮以下情況:限制基於IP或cookie的用戶活動?

  1. 如果用戶已登錄,我可以登錄用戶的ID,並且可以限制對同一項目的投票,如果他再次投票。
  2. 如果用戶沒有登錄,我可以從同一個IP登錄用戶的IP,並限制同一項目的投票。

如果是第一種情況,則不需要記錄IP。現在,第二起案件讓我感到非常緊張。我想知道用戶可能正在更改IP,然後再次對同一項目進行投票。現在,即使我使用Cookie或會話變量,也可能會發生用戶正在開始新會話(或已刪除Cookie)以再次對同一項目進行投票的情況。

我錯過了什麼嗎?如果不是,如何處理這種情況?有什麼想法嗎?

+0

如果用戶登錄,爲什麼不鎖票到他們的帳戶? (在這種情況下IP鎖是冗餘的。)另外,如果您關心投票的準確性,只允許登錄用戶進行投票。 :-) – 2011-01-24 22:32:48

+0

由於公司代理有幾千ip我可以通過刷新多次投票也可以阻止別人投票認爲他們是我的,因爲代理也; ergo,使用ip是沒用的。 – 2011-01-24 22:38:43

+0

@middaparka,我打算讓它開源。所以這是開發者的選擇,他想要做什麼/他的需求。我自己寧願登錄投票。但如果它是一個博客或類似的網站,並非所有的用戶都登錄了,我會怎樣處理這種情況。 – abhisek 2011-01-26 03:43:32

回答

6

我會認真考慮使用Captcha,reCaptcha是一個不錯的選擇。

您可以通過IP地址進行限制,但其可能會讓一些人共享1個IP地址,例如小型學校或企業。由於代理是免費且充足的,因此它也很容易繞過。它也容易出錯,因爲有時負載均衡器會在會話期間更改IP地址。如果你真的想限制每人的投票數量,最好的辦法是要求他們登錄到用戶帳戶並將選票存入數據庫。

+2

+1對於未登錄用戶而言,reCaptcha是一個不錯的主意。 – 2011-01-24 22:34:25

2

首先,有幾種方法可以使用PHP獲取客戶端的IP地址。這裏有3種方法,我知道的:

if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { 
    $ipAddress = $_SERVER['HTTP_X_FORWARDED_FOR']; 
} else if (isset($_SERVER['HTTP_CLIENT_IP'])) { 
    $ipAddress = $_SERVER['HTTP_CLIENT_IP']; 
} else if (isset($_SERVER['REMOTE_ADDR'])) { 
    $ipAddress = $_SERVER['REMOTE_ADDR']; 
} 

其次,如果你擔心易失性存儲器,如餅乾或會話,它可能是最好的有哪些存儲這些值的數據庫表。它可以是一個帶有3列的簡單表格:client_ip,item_id和date_created。這將允許您跟蹤是否使用特定的IP地址投票給某個項目。

現在,我看到的唯一問題是如果客戶端在工作並坐在代理之後。所以,我想你有幾個選擇,每個都有自己的利弊。

1

您可以嘗試使用evercookie,它有點難以明確

相關問題