2011/11/09

[phpbb]對抗spam機器人大戰

由於我有用phpBB3架設一個論壇,維護論壇的工作還算是駕輕就熟,但是長期以來對付spammer,一直是很討厭的事。亂發文章的spammer如果是人,那還好辦,通常警告一下就沒事。Spammer如果是個機器人程式,那就煩了,他會自己註冊帳號、自己發文,客氣一點的發個一兩篇,不客氣的,直接把你的討論版塞滿垃圾文。


使用圖形式驗證也行之有年,我最後一代使用的是reCAPTCHA,不過不到一年也被破解了。後來phpBB的驗證系統多了問答集(Q&A),也就是你問一個夠特殊的問題,讓用戶可以想到答案,但是機器人無法猜到解答。例如我在網站左上角放了網站的成立時間。使用者註冊時,必須回答這個成立的年份加十年是哪一年,結果效果相當不錯,大約又有很長一段時間沒有機器人來騷擾(想必機器人的中文是不太好 =_=)。不過最近,這招還是被破解了,再換個題目也只是治標不治本的方法,因此我查詢了一下,找到了救星... Stop forum spam網站(後續簡稱SFS)。

SFS提供搜尋,讓你用會員的ip、email、帳號名稱來查詢,是否有被其他論壇告過狀,更好的是,SFS也提供API讓網站管理者可以加個簡單的程式,就可以自動化辨識使用者是否在黑名單上,SFS會回傳各項資料是被檢舉過幾次。以phpBB 3.0.9為例,最適合加入的地方就是在註冊頁,首先找到 includes/ucp/ucp_register.php,在大約238行找到

// DNSBL check
if ($config['check_dnsbl'])
{
if (($dnsbl = $user->check_dnsbl('register')) !== false)
{
$error[] = sprintf($user->lang['IP_BLACKLISTED'], $user->ip, $dnsbl[1]);
}
}

在之後(約246行)加入一段SFS API:

$xmlStr = @unserialize(file_get_contents("http://www.stopforumspam.com/api?ip=" .$user->ip. "&email=" .$data['email']. "&f=serial"));
if($xmlStr['ip']['frequency'] >= "3" || $xmlStr['email']['frequency'] >= "3") {
mail('[email protected]', 'spam alert '.date("Y-m-d"), $user->ip." x".$xmlStr['ip']['frequency']."\n".$data['email']." x".$xmlStr['email']['frequency']);
$error[] = "We're Sorry! The email address is not allowed. Or your IP address is blacklisted. Please contact the webmaster if this is in error.";


程式相當簡潔,$xmlStr取回檢舉資料,如果ip或是email其中一個被檢舉大於3次(可以自訂,通常spam ip都早已被檢舉上百次),就發個mail(紅色部分)通知管理員,[email protected]請自行修改為收件人email,主旨會是spam alert加上當天日期。收到信的內容大致如下:
69.162.74.82 x6044
[email protected] x1457
這個ip已經被檢舉6044次。重點是紫色部分,只要$error裡面有值,註冊就不會過。其實原本是沒有寫mail機制,但是因為不知道到底有沒有成功,於是加上個mail機制才知道有沒有抓到機器人。結果實際測試的時候,12小時收到三十幾封email,沒有一個機器人註冊成功,真的是非常有效啊 ^_^

除此之外,可以進一步在管理會員頁,增加如下的連結:
萬一有可疑的帳號需要檢測時,可以一鍵詢問SFS。SFS的資料來源都是靠網友們檢舉,因此也可以加上一個檢舉的連結,不過要使用到檢舉的API功能,必須先註冊帳號取得API key,才可以加入檢舉spammer的行列哦。



1 則留言:

Wilhelm Liao 提到...

這個服務看來挺實用的,感謝分享&介紹!