Wabow Information Inc. Blog
分類: 技術分享 作者: daniel
20 八月 2009目前大部分網站在表單發送時,判斷機器人發送廣告、垃圾留言的方法是採用 CAPTCHA 的方式;然而如同之前在部落格上分享過的文章所述,額外的驗證碼機制反而造成使用者在參予留言或討論時望之卻步。同篇文章中也提到 WordPress 用來防治垃圾留言的 Plugin NoSpamNX;最近剛好客戶有阻擋垃圾留言的需求,所以就稍微研究了一下,順便改成 class 讓使用上能更具彈性。

基本的流程是在建構式中,將隨機產生的隱藏驗證碼存入 SESSION,同時利用這些值建立隨機順序的 HTML 碼,在使用者 POST 的時候加以驗證。
首先要在網頁的最上面先開啟 SESSION,並建立 NoSpamNX 物件,同時寫入 SESSION,產生 HTML 碼
// 啟動 SESSION session_start(); // 載入 NoSpamNX class include_once('NoSpamNX.php'); // 建立物件時可以指定 SESSION 的名稱,或不輸入使用預設值 $noSpamNX = new NoSpamNX('test_for_NoSpamNX'); // 產生隨機順序的隱藏欄位 $hidden_fields_for_NoSpamNX = $noSpamNX->addHiddenFields();
將 HTML 碼嵌入表單中
echo $hidden_fields_for_NoSpamNX;
在送出表單後,根據:
1. 檢查 POST 過來的資料中,是否有 'nospamnx-1' 產生的 MD5 Name;不存在=機器人
2. 檢查 POST 過來的 'nospamnx-1' MD5 Name,其值是否為零;不為零=機器人
3. 檢查 POST 過來的資料中,是否有 'nospamnx-2' 產生的 MD5 Name;不存在=機器人
4. 檢查 POST 過來的 'nospamnx-2' MD5 Name,其值是否為 SESSION 中 'nospamnx-2' MD5 Value;不相等=機器人
每次通過檢查後就會清空 SESSION,所以每一個留言所使用的隱藏驗證碼都是不一樣的。
距離之前介紹 NoSpamNX,已經有一段時間;而作者在新版加入了選擇性的 HTTP referrer 判斷。不過因為難免會造成誤判的情況,以及程式寫起來有點醜(誤)等種種原因,所以並沒有放在這次的 class 裡面。
最後關於範例程式下載,請參考《[分享] 垃圾留言判斷,隱藏驗證碼的 NoSpamNX class PART2》。
4 Responses to [分享] 垃圾留言判斷,隱藏驗證碼的 NoSpamNX class
fillano
八月 20th, 2009 at 5:16 下午
我只用過RobotAway...
不過想了一下,有幾個提高難度的做法,例如動態產生驗證表單欄位名稱、隨機挑選驗證的演算法等等。反正都是存在session裡,應該都可以做的出來。
captcha也有更難破的做法,例如改成謎題,像是數圖片裡面有幾個某種圖形,且謎題的敘述也放在圖片裡。
daniel
八月 20th, 2009 at 11:11 下午
動態產生表單欄位名稱,之前的 Yawasp 就是醬的作法
隨機挑選驗證的演算法,這方法好像還不錯...
存在 SESSION 裡的確是都可以做,但就是難逃機器人的垃圾留言啊~
不考慮複雜的 CAPTCHA,會採用隱藏驗證碼就是不想增加使用者的負擔啊
我看到那種「從九宮格圖片中挑出三張是狗的圖片」的驗證整個 LP 火就上來了...(噗)
感謝分享~^^
Brian
八月 21st, 2009 at 11:05 上午
其實CAPTCHA都可以用AI破解
幸好這還不普及
fillano
八月 21st, 2009 at 10:52 下午
其實潑垃圾訊息的套裝軟體應該都有內建破CAPTCHA的功能,這已經行之有年了,真的要用類神經網路來做針對CAPTCHA的OCR應該也不是難事。
幾年前google code上面就有OCR的程式,我同事試過,參數調得好,抓CAPTCHA的辨識效果就不錯...
(另外,我在John Resig的blog看到他提過有人用js+canvas+類神經網路技術來破解CAPTCHA)