1 頁 (共 1 頁)

[phpbb]對抗spam機器人大戰

發表於 : 2012-06-14 17:13:02
Yehlu_G551
http://blog.sushiboy.com/2011/11/phpbbspam.html

由於我有用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('xxx@xxx.com', '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(紅色部分)通知管理員,xxx@xxx.com請自行修改為收件人email,主旨會是spam alert加上當天日期。收到信的內容大致如下:
69.162.74.82 x6044
xxxxxx@xxx.com x1457這個ip已經被檢舉6044次。重點是紫色部分,只要$error裡面有值,註冊就不會過。其實原本是沒有寫mail機制,但是因為不知道到底有沒有成功,於是加上個mail機制才知道有沒有抓到機器人。結果實際測試的時候,12小時收到三十幾封email,沒有一個機器人註冊成功,真的是非常有效啊 ^_^

除此之外,可以進一步在管理會員頁,增加如下的連結:

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

Re: [phpbb]對抗spam機器人大戰

發表於 : 2013-05-22 16:27:33
yehlu
http://wlx.westgis.ac.cn/575/

phpbb3自身带的anti-spam系统已经被破解,导致论坛上出现了大量的垃圾帖子和用户。
经搜索,可以暂时使用PHPBBCHINA上的这个方案:

Administration Control Panel -> Users and Groups -> Custom profile fields
[Create new field]: antibot (Field identification: antibot, Field type: Numbers)
Display in user control panel: Yes
Display on registration screen: Yes
Required field: Yes
Field name: Anti-Bot check
Field description: 如果您不是机器人,请输入一个130到139之间的数字:
[Profile type specific options]
Lowest allowed number: 130
Highest allowed number: 139
没有用mod,目前为止好像有效,是俺搞完后做的记录,看不明白的可以问,

还有一个办法是使用初始发帖审核,可阻止垃圾帖泛滥,但不能应对注册,设置很简单:
Administration Control Panel -> General -> Post settings
Enable queued posts: Yes
默认的最大帖子数是3,也就是说,只有前3帖通过审核发表后,用户才能自由发帖。
否则你发了他也不显示。。。
注意这个是3.0.0以后版本才有的功能(3.0.0本身木有)