2012-02-09 45 views
3

我想建立一個不需要人登錄的投票系統,但他們可以按自己的意願進行投票。PHP投票系統,如何阻止垃圾郵件?

如何阻止人們在投票中發送垃圾郵件(發送請求添加投票)?我知道使用客戶端腳本可以很容易地阻止它(來自正確的用戶),但服務器端(PHP)又如何呢?我不希望人們擁有這個網址,並不斷地增加它的數量。

乾杯

+5

只是一個說明,「使用客戶端腳本可以很容易地停止(垃圾郵件)」是不正確的。任何客戶端腳本都可以輕鬆繞過。 – CanSpice 2012-02-09 00:30:43

+1

沒有登錄,首先想到的就是存儲IP地址和每個投票,並用它來檢查用戶還沒有投票。這不是一個防彈解決方案,但它可能會擺脫你的大部分問題。 – 2012-02-09 00:31:32

+1

在CanSpice的評論上詳細闡述一下 - 只是禁用Javascript會使您的所有客戶端驗證毫無意義。如果一份工作值得做,那麼值得做一個服務器端的工作;客戶端代碼只是給合法用戶更容易的時間,在提交表單之前給他們反饋。 – Joe 2012-02-09 00:35:25

回答

4

實施reCAPTCHA - 實施起來非常容易(可能需要10分鐘),是一種很好的反垃圾郵件措施,並且具有更大的用途(數字化書籍)。

如果你真的想去用cookies,看看evercookies。他們是超級侵入,而且非常不道德的,但是,嘿,這是你的網站:)

2

你必須登錄自己的IP和/或設置cookie。 Cookie的問題是客戶端可以清除它們,IP跟蹤的問題在於,如果NAT防火牆處於混合狀態,它可以阻止多個用戶,但大多數情況下它會很好地工作。

+2

另外,您可以使用必須以投票方式提交的表單中隱藏值的安全令牌。如果令牌不存在,那麼您不計數投票。這樣,一個人不得不至少寫一個能夠從表單中提取代碼的刮板,而不是試圖發送假票。 – drew010 2012-02-09 00:33:30

2

您可以添加vote_tracking表:

vote_tracking 
    id 
    poll_id 
    session_id 

當在特定輪詢用戶的投票,你可以更新與他們的會話ID行。

然後,您需要實施一些代碼,以確保您不會繼續發出查詢以確定用戶是否已在投票中投票。如果你有一個'主動'民意調查,你可以做一次查詢,然後註冊一個表明他們已經投票的會話var,所以不管這個民意調查有多少次被渲染,你都不會繼續點擊數據庫。顯然這隻會在當前session_id匹配時才起作用,當它不同時,您將不得不發出第一個查詢,然後重置會話var。

我建議收集機制,以便您的表最終不會有一百萬行。如果您創建一個新的「活動」民意調查,則截斷vote_tracking表,或者通過重命名該表進行歸檔。

此外,IP跟蹤的問題在於,您將bork用戶置於代理之後,在第一個人投票後沒有其他人將能夠投票。

+0

與將它作爲會話變量存儲並沒有什麼不同,並且仍然像打開刪除cookie一樣的缺陷。 – Joe 2012-02-09 00:37:03

+0

IP跟蹤的問題在於,您將bork用戶置於代理之後,在第一人投票之後,其他人將無法投票。完全同意 – Bruce 2012-02-09 00:40:18

+1

當然,用戶可以重置會話ID,但通過以這種方式存儲會話ID,他可以計算投票數量的指標,他甚至可以添加時間戳列並確定一天的投票模式。除非他實施登錄機制,否則沒有解決方案可以100%保護投票垃圾郵件,但至少該解決方案具有一些未來的靈活性。 – 2012-02-09 00:40:28