2012-07-18 30 views
1

我的網站上的用戶有一個公開可見的個人資料,他們通過簡單的HTML表單接受訂閱。這些訂閱將合併到此用戶的電子郵件列表中。允許訂閱者列表註冊但阻止腳本

有人可以編寫一個腳本,不斷註冊電子郵件以銷燬/淹沒用戶的列表。這可以通過使用基於IP的速率限制來緩解,但如果腳本在分佈式環境中運行,則此解決方案不起作用。

我能想到的唯一策略是使用驗證碼,但我真的很想避免這樣做。我還能嘗試什麼?

+0

我完全不明白你有什麼問題,有太多的用戶訂閱列表還是什麼? – 2012-08-07 21:58:09

+0

如何讓用戶通過簡單的html表單「接受」訂閱請求? 對於用戶,那麼你可以通過他們的ip將訂閱請求分組,並以不同的方式顯示它們。這樣用戶會知道他們是否是假的。 這是一種方法。 – Prasanth 2012-08-07 21:58:32

+0

@ OlegV.Volkov問題是有一個惡意腳本訂閱100k假電子郵件列表,導致列表變得無用。 – Harper 2012-08-07 23:00:17

回答

1

你的問題基本歸結爲「如何在不使用CAPTCHA的情況下將人類和計算機分開?」

這確實是一個相當複雜的問題,有很多不同的答案和方法。在下面我會試着舉幾個例子。其中一些想法取自this article (German)

就我個人而言,我認爲某種CAPTCHA將是一個完美的解決方案。這不是 必須在圖像中扭曲文本,你也可以使用邏輯謎題或簡單的 計算。但通過以下方法,您可以嘗試避免使用CAPTCHA;請記住,這些方法總是比需要用戶交互的CAPTCHA更容易繞過。

  1. 在窗體中使用隱藏字段作爲蜜罐(type=hidden或使用CSS)。如果填寫了這個字段(或者有其他的值),那麼你已經發現了一個bot(垃圾郵件機器人通常不會執行語義分析,因此他們填寫了他們找到的所有內容)。然而,如果機器人專門針對你,或者只是瞭解該領域的名稱並避免它,這將無法正確工作。

  2. 使用JavaScript檢查表單提交的速度。當然,人類需要一些時間(至少幾秒鐘)來填寫表單,而機器人要快得多。 您還應該檢查表單是否在短時間內多次提交。如果你使用AJAX表單和/或服務器端,這可以通過JavaScript來完成。 缺點是(正如你自己提到的那樣),它在分佈式系統中不起作用。

  3. 使用JavaScript檢測焦點事件,點擊或其他鼠標事件,表明您正在處理人類。該方法在this blog article(包括一些源代碼示例)中進行了描述。

  4. 檢查用戶是否使用標準Web瀏覽器;垃圾郵件發送者有時使用自己寫的程序。您可以檢查用戶代理字符串,但這可以輕鬆地進行操作。特徵檢測將是另一種可能性。

當然,如果用戶禁用JavaScript,方法2-4將不起作用。在這種情況下,例如,您可以在<noscript>標籤中顯示普通的CAPTCHA。在任何情況下,您都應該總結幾種方法以獲得有效且用戶友好的測試。

最後我想到的是(在你的具體情況下)是檢查輸入的電子郵件地址的有效性(不僅在語法上,而且還檢查地址是否真的存在)。這可以通過幾種方式完成(請參閱此question on SO),但它們都不是真的可靠。所以,再次,你將不得不結合不同的方法,以便可靠地告訴人類和機器人分開。

+0

+1和賞金。謝謝你的回答 – Harper 2012-08-10 04:04:38

1

假設誰開始發送垃圾郵件您的網站專門針對您的網站(而不是一個隨機的垃圾郵件機器人),並會嘗試積極解決所有對策,那麼唯一的選擇是某種驗證碼,因爲任何事情都可以自動避免。

防止假冒/垃圾郵件提交的所有非驗證碼的方法通過利用漏洞腳本做自動提交或提交的分析內容工作,要麼。對於提交內容類型,內容分析在這裏不是真正的選擇。那麼剩下的就是各種各樣的戰鬥中使用,例如垃圾評論的自動提交預防:

  • 基於CSS的解決方案(比如這個:http://wordpress.org/extend/plugins/spam-honeypot/
  • JS基礎的解決方案:隱藏字段由數據填充由JavaScript計算 - 如果內容被作爲垃圾郵件腳本一樣簡單的東西,不支持Java腳本它很容易檢測到的提交

這是可能的工作,這兩個繞如果攻擊者知道他們在那裏 - 例如當您的網站是一個選定的,而不是隨機的目標。

總結:有很多解決方案可以很好地阻止隨機垃圾郵件的提交,但是如果有人專門針對您的網站,唯一真正有效的方法就是電腦不好 - CAPTCHA。

+0

+1 - 謝謝你的回答。 – Harper 2012-08-10 04:04:56