2015-12-19 44 views
2

我有一個網站,用戶可以發帖子投票。允許訪客用戶投票發佈是非常重要的,避免來自同一位訪客的多票投票也非常重要。如何防止訪客用戶投票兩次?

Cookies,可以很容易地刪除,所以這不可能是解決方案。

IP,如果你考慮NAT的情況非常糟糕。

所以我想,我需要更先進的方式去,也許其他類型的餅乾..?

如果有人在類似的情況下有經驗請幫助。

+1

你不能阻止這種情況發生。你只能盡力去限制它。 –

+0

你可以使用指紋技巧,雖然這也不是萬無一失的。如果你想絕對確定,你必須實現一個真正的認證機制。 – Pointy

+1

嘗試使用這個 - https://github.com/samyk/evercookie –

回答

2

什麼,你只可以做在用戶未登錄 - 是使竭盡全力地爲他們投票的第二次。例如,您可能:

在客戶端:

  • 設置cookie的
  • 信息寫入瀏覽器存儲
  • 使用所謂的閃存餅乾

在服務器端 - 商店並檢查有關用戶儘可能多的信息,您可以:

  • 存儲用戶IP(包括代理IP等)
  • 存儲瀏覽器指紋此IP和瀏覽器指紋(永久或一段時間)
  • 存儲用戶時區
  • 塊表決。

但你仍然無法阻止智能,真正想從投票作弊匿名用戶。

因此,它可能不試圖阻止投票,但它可以檢測並「複製」票反而更有益(即在相同的時間段內從相同的IP和瀏覽器組合投票選擇相同的選項可能被認爲是「被欺騙」)。

+0

只是好奇,如果你知道任何庫,該文件摘要列出這些方法來識別用戶,最好在PHP上。會真的幫助。我認爲這對人們來說應該是非常普遍的要求。 – ggat

+0

@Giga不幸的是我不知道任何這樣的圖書館。但根據我的經驗,我可能會說存儲IP和瀏覽器標題組合運行良好(兩個用戶在同一個ip上的瀏覽器標題相同的機會很小)。 –

+0

正如你所說,對於重複投票過濾,如果用戶手動創建HTTP請求並更改UA值,則很容易被欺騙。 – ggat

0

是唯一半完美的解決方案是跟蹤IP地址。您可以將它們永久存儲在表中,或將它們緩存在Memcache或類似的一段時間。當然,如果用戶登錄,最好的方法是簡單地檢查用戶是否已經投票。

會話和Cookies是無用的,因爲人們可以簡單地寫忽略會話數據的自動投票算法。

0

如果用戶是匿名用戶並且不需要進行身份驗證,則無法阻止此操作。

如果有人真的想投幾次,用戶可以只打開網頁其他設備上,並再次表決,即使你能認同的一種永久性的Cookie的他/她的設備。

看來您已經預料到會有用戶刪除他們的Cookie以便能夠再次投票。你將無法阻止它們,但你可以讓它變得更難。