Ricky兄的防機器人灌水法試用

 Thu, 25 Oct 2007 13:07:34 +0800

方法及程式發表在[酷!學園 -> PHP程式設計]論壇中,這個網址:http://www.ez2.us/~ricky/RobotAway/則有範例與程式下載,也可以線上檢視原始碼。使用起來十分簡單。

他的原理是用一些javascript的混淆技術,包括隨機變數名稱、隨機註解、程式內容編碼等方法,讓機器人難以即時破解,來達到防止灌水的目的。(這些也是病毒上常見的變形、混淆技術)

最大的好處是,對於一般的網頁用戶來說,不會感覺到這個程式的存在,不像一般的captcha需要額外輸入文數字來驗證。對於程式設計師來說,只要用到三個方法,配合網頁程式,就可以做出來,非常簡單。

在上述的連結,Ricky兄有提供使用的範例。不過因為使用簡單,所以也不太需要繁雜的說明。另外,程式是寫成php5的類別,對於php4的用戶來說,只要拿掉private關鍵字,把constructor函數從__construct改名為RobotAway就可以了。

使用步驟大致如下:

  1. 在php程式中引用"rw.inc.php"
  2. $ra = new RobotAway("SITEKEY","INPUTNAME");
  3. 在form中加入名為"INPUTNAME"的隱藏欄位,記得要把id也設為"INPUTNAME"
  4. 用$ra->GenerateJS()方法產生混淆過的javascript函數
  5. 用$ra->CheckFunction()方法產生呼叫上述函數的javascript
  6. 在submit之前攔截submit,插入步驟5的php來產生呼叫步驟4的javascript函數,動態賦值給INPUTNAME隱藏欄位,然後才submit
  7. 在伺服器端,利用$ra->Verify()方法來檢查$_POST['INPUTNAME'],(在之前要用步驟2的同樣參數生成$ra),就知道傳進來的值是否正確。

應用一些方法,還可以讓這個程式更難捉摸。就是在要輸入表單的地方,用隨機產生的SITEKEY與INPUTNAME來產生$ra物件,然後把SITEKEY與INPUTNAME存入session,要做Verify時,再從session中取出SITEKEY與INPUTNAME來產生$ra物件,因為每次欄位名稱與sitekey都不一樣,會更增加機器人灌水的難度。