[分享] 垃圾留言判斷,隱藏驗證碼的 NoSpamNX class

分類: 技術分享 作者: daniel

20 8 月 2009

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

nospamnx_class949
基本的流程是在建構式中,將隨機產生的隱藏驗證碼存入 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

Avatar

fillano

8 月 20th, 2009 at 5:16 下午

我只用過RobotAway...

不過想了一下,有幾個提高難度的做法,例如動態產生驗證表單欄位名稱、隨機挑選驗證的演算法等等。反正都是存在session裡,應該都可以做的出來。

captcha也有更難破的做法,例如改成謎題,像是數圖片裡面有幾個某種圖形,且謎題的敘述也放在圖片裡。

Avatar

daniel

8 月 20th, 2009 at 11:11 下午

動態產生表單欄位名稱,之前的 Yawasp 就是醬的作法
隨機挑選驗證的演算法,這方法好像還不錯...
存在 SESSION 裡的確是都可以做,但就是難逃機器人的垃圾留言啊~

不考慮複雜的 CAPTCHA,會採用隱藏驗證碼就是不想增加使用者的負擔啊
我看到那種「從九宮格圖片中挑出三張是狗的圖片」的驗證整個 LP 火就上來了...(噗)

感謝分享~^^

Avatar

Brian

8 月 21st, 2009 at 11:05 上午

其實CAPTCHA都可以用AI破解
幸好這還不普及

Avatar

fillano

8 月 21st, 2009 at 10:52 下午

其實潑垃圾訊息的套裝軟體應該都有內建破CAPTCHA的功能,這已經行之有年了,真的要用類神經網路來做針對CAPTCHA的OCR應該也不是難事。

幾年前google code上面就有OCR的程式,我同事試過,參數調得好,抓CAPTCHA的辨識效果就不錯...

(另外,我在John Resig的blog看到他提過有人用js+canvas+類神經網路技術來破解CAPTCHA)

我要留言

關於這裡

這個部落格分享了哇寶在電子商務領域的技術及資訊,希望能讓更多人一起為台灣的網路產業加油。