2006年12月17日 星期日

關於驗證碼這玩意兒

首先小弟要強調這東西的重要性,就在幾週前,小弟好不容易回家一趟,收信發現小弟維護的一個站寫信來,說討論區被大量註冊,請小弟幫忙砍帳號,於是小弟只好用緩慢的ADSL連上某phpbb2討論區砍帳號,沒想到,一次只能砍一個,沒有使用者列表一次可以勾好幾個的功能,終於砍完了,沒想到前天去看,又出現了...!@#$%^&*(@#$@#$

於是我去找了一下相關資料,發現moto使用了phpbb2驗證碼 ,十分慶幸討論區只有被註冊沒有被大量貼文...,為了防止討論區繼續被大量註冊,所以把之前寫的"雞兔同籠"驗證程式搬到phpbb2上面來用,依照小弟某Kuso網友建議將此類別命名為KUSOcode...

程式內容就不再廢話了,各位有興趣自己下載看,後來小弟又上網去找的一下各種驗證碼的資料得到以下結論

1.遭SPAM程度:無>純文字>圖片>語意
2.遭SPAM程度:公用程式>客制化程式

其中語意驗證對國外SPAM效果不錯,不過有個小缺陷,如果網站屬於多語系內容會造成困擾,但是用在像小弟blog這種全中文內容的blog是不錯的選擇,而一般的SPAM只對公用程式下手(報酬率高),不過以上幾種驗證碼在遭遇對岸使用真人SPAM,全部無效....!@#$%^&@#%$%

目前的驗證碼都屬於靜態驗證碼,也就是說驗證碼的答案在要求網頁的時候已經確定了,這又分成兩種,一種是將驗證碼答案存在session中,另一種是將驗證碼答案隱藏在用戶端表單內,這兩種各有優缺點,存在session中要破解驗證碼只能從辨識驗證碼本身下手,如果驗證碼是文字就從原始碼去抓,如果是圖片則使用影像辨識,破解機率略低,不過會有session過期的問題存在,而將驗證碼存在用戶端雖然可以降低伺服器負擔也沒有session過期的問題,但是用戶端可以偽造答案,造成驗證碼失去意義,以上是目前靜態驗證碼的部分。

於是小弟想到既然ajax可以做到動態取得資料,何不把"一次密碼"(one-time password)使用到這個地方呢?在網頁載入後與伺服器做時間同步,接著用演算法算出驗證碼,倒數一定時間後重新產生驗證碼,但使用flash比較不容易被抓到驗證碼資料,而且flash可以在顯示驗證碼的時候使用動畫干擾影像辨識,似乎是個不錯的選擇,不過小弟不會寫flash,所以還是呆呆的使用"雞兔同籠"驗證碼好了....。
[gallery]