2010-12-17 53 views
2

我需要你的意見對這個代碼用於實現反垃圾郵件解決方案:PHP - 驗證碼更換

  • 當產生頁/形式,一個隨機字符串被創建,例如。像$string = md5($_SERVER['REMOTE_ADDR'])
  • 此字符串插入到數據庫中,並設置爲過期後,假設2小時,我們不填寫數據庫
  • 在網頁加載時,窗體有一個隱藏的輸入字段沒有價值,讓我們的名字它spam_check
  • 頁面已加載AJAX請求後10,15或20秒自動啓動,試圖檢索$string從db &填寫spam_check輸入值與它。
  • 提交表單的時候,我們執行$string從DB和$_POST['spam_check']之間進行簡單的檢查,如果它們不匹配的郵件是垃圾郵件...

這是一個好主意?它有多安全? 明顯的優勢是,它不需要訪客的任何操作,如閱讀驗證碼等。

+1

即使它是垃圾郵件,我也很困惑,因爲垃圾郵件工具獲取html代碼並根據該代碼發佈帖子,所以該值將是正確的。我弄錯你了嗎? – Pabuc 2010-12-17 12:08:10

+0

好的想法是,垃圾郵件機器人不會做JavaScript,如果它提交表單,則不會等待10秒鐘: – Alex 2010-12-17 12:09:13

+0

如果用戶輸入的速度非常快,但會出現問題 – robjmills 2010-12-17 12:36:29

回答

0

有趣。我會考慮將其視爲垃圾郵件/替換垃圾郵件的解決方案,但這確實會使垃圾郵件發送者的生活變得更加困難。

但是,您應該計劃處理javascript被禁用的情況(可能還有CSS) - 例如,通過爲表單分配一個div,但留下一個默認消息,然後使用javascript(內聯而不是等待onload/pageready)將表單寫入它。

$字符串= MD5($ _ SERVER [ 'REMOTE_ADDR'])

這不是一個隨機值 - 它也不會改變。考慮:

$ string = sha1($ _ SERVER ['REMOTE_ADDR']。rand(1000).time());

(雖然底層算法需要更多ops,但sha1稍快於md5)。

這可能是一個好主意,使用一個會話,並且:(SESSION_ID()蘭特(1000)。時間())

$ _ SERVER [ '字符串'] = SHA1;

+0

謝謝。我對會話不太瞭解,我聽說他們是邪惡的,所以我沒有搜索更多的信息:)但我現在要做 – Alex 2010-12-17 16:09:55

4

由於$string不是非常隨意的,並且AJAX請求對於試圖規避您的保護的人可見,建立自動化很容易,事先檢索$string,然後將大量垃圾郵件發送到該表單上。

3

我喜歡的一種方法是使用CSS來隱藏<input type="text">元素。機器人不知道它是否隱藏,普通用戶永遠不會看到它。

看看這個帖子裏這個話題已經廣泛討論 Practical non-image based CAPTCHA approaches?

不管怎麼說,考慮到你的真正的問題is this a good idea?,我想不出理由,爲什麼它不會工作...我認爲數據庫部分是沒有必要的,但還有其他的方法,你可以在前面的鏈接看到...

+0

我使用這種「蜜罐」技術,我發現它非常有效 – robjmills 2010-12-17 12:37:27