Tommy 碎碎念

Tommy Wu's blog

« 上一篇 | 下一篇 »

討厭的廣告 bot, 別再來我的 phpBB 了....
post by tommy @ 10 四月, 2006 14:59
phpBB 是一套在 internet 上頭, 極為普遍的討論區軟體, 但是, 也由於太多人使用它, 就有人針對這套軟體, 開發了專門用來註冊與發廣告的 bot. 而近來, 在我常出沒的酷學園裡頭, 一星期總會出現數十篇廣告, 讓版主們砍文砍到手軟.

所以, 我們目前採用了下列幾個預防的措施,  用來減少這類的 bot 到 phpBB 來搗亂:

  • 把 phpBB 2.0.12 之後所內建的註冊確認碼功能打開. 可以在註冊時, 要求使用者輪入所出現圖案的文字, 以降低 bot 運作的可能性.
  • 在觀察多數用來發廣告所註冊的 ID 之後, 發現他們都有設定個人網站這個欄位. 所以我們做下列的修改, 限制使用者註冊時, 無法同時輸入個人網站這個欄位. 如果要設定這個欄位, 可以在註冊成功後再修改.
修改 language/lang_chinese_traditional_taiwan/lang_main.php, 加上
$lang['Website'] = '個人網站';
$lang['Website_explain'] = '在註冊時請將此欄位留空白, 等註冊後再更改這個欄位';
 
修改 templates/subSilver/profile_add_body.tpl, 找到下頭的內容
<td class="row1"><span class="gen">{L_WEBSITE}:</span></td>  
改成
<td class="row1"><span class="gen">{L_WEBSITE}:</span><br />
<span class="gensmall">{L_WEBSITE_EXPLAIN}</span></td>

修改 includes/usercp_register.php, 找到下頭的內容
'L_WEBSITE' => $lang['Website'],  
在後面加上
'L_WEBSITE_EXPLAIN' => $lang['Website_explain'],  
再找下頭的內容
if ( $website != '' )
{
rawurlencode($website);
}

在後面加上
if ($mode == 'register') {
if ($website != '') {
$error = TRUE;
$error_msg .= ( ( isset($error_msg) ) ? '<br />' : '' ) . $lang['ANTISPAM_Website'];
}
}
 
經過上頭的修改, 如果使用者註冊時, 有輸入個人網站欄位, 就會顯示錯誤訊息, 無法成功註冊. 其實在後頭加上一個 checkbox, 讓使用者必須選取這個欄位才能註冊, 也能做到同樣的效果, 所以這個地方先移除不做了, 改用後頭的方式來防止.
  • 參考 ANTISPAM 這個 MOD. 由於上頭對於時間的檢查, 似乎沒有必要, 所以我們修改一下, 只使用其中的概念, 在發文所使用的 form 上頭, 加上兩個用來檢查的欄位.
修改 includes/constants.php, 加上下頭這個設定, 你可以改成你想用的字串
define('ANTISPAM', 'ANTISPAM Check!'); 
修改 language/lang_chinese_traditional_taiwan/lang_main.php, 加上
$lang['ANTISPAM_Error'] = 'ANTISPAM MOD 檢查失敗!'; 
修改 templates/subSilver/posting_body.tpl, 找到下頭的內容
{ERROR_BOX} 
在後頭加上
<input type="hidden" name="date" value="{DATE}" />
<input type="hidden" name="{HCODENAME}" value="{HCODE}" />
如果有使用快速回應的 MOD, 則修改 templates/subSilver/viewtopic_body.tpl, 找到下頭的內容
{quick_reply.U_HIDDEN_FORM_FIELDS} 
在前頭加上
<input type="hidden" name="date" value="{DATE}" />
<input type="hidden" name="{HCODENAME}" value="{HCODE}" />
修改 posting.php, 找到下頭的內容
$bbcode_uid = ''; 
在後頭加上
$hcode = $HTTP_POST_VARS[md5($userdata['username'] . $HTTP_POST_VARS['date'] . ANTISPAM)];
$hcode_old = md5($userdata['username'] . $userdata['user_regdate']);
if (!isset($hcode) || empty($hcode) || $hcode != $hcode_old) {
message_die(GENERAL_MESSAGE, $lang['ANTISPAM_Error']);
}  
找到下頭的內容
$template->assign_vars(array( 
在前頭加上
$hcode_date = gmdate('U'); 
找到下頭的內容
'L_BBCODE_CLOSE_TAGS' => $lang['Close_Tags'], 
在前頭加上
'HCODE' => md5($userdata['username'] . $userdata['user_regdate']),
'HCODENAME' => md5($userdata['username'] . $hcode_date . ANTISPAM),
'DATE' => $hcode_date,
如果有使用快速回應的 MOD, 則修改 viewtopic.php, 找到下頭的內容
$template->assign_vars(array( 
在前頭加上
$hcode_date = gmdate('U'); 
找到下頭的內容
'S_TOPIC_LINK' => POST_TOPIC_URL, 
在前頭加上
'HCODE' => md5($userdata['username'] . $userdata['user_regdate']),
'HCODENAME' => md5($userdata['username'] . $hcode_date . ANTISPAM),
'DATE' => $hcode_date,
經過這樣的修改之後, 系統在產生發表文章的 form 時, 會加上兩個特別的欄位, 對每個使用者在不同的時間點, 這兩個欄位的內容都不相同. 而系統在使用者 submit 這個 form 的時候, 會檢查這兩個欄位是否存在, 且內容是否符合, 如果不符合, 則認定為 bot 所發的文章. 因為在正常的使用下, 應該都會符合才對.
  • 由於上頭那個 ANTISPAM MOD 的作法, 每天的確擋下了不少的 bot 前來發文, 所以, 我們依照同樣的作法, 運用在註冊上頭, 避免 bot 前來註冊.
修改 language/lang_chinese_traditional_taiwan/lang_main.php, 加上
$lang['ANTISPAM_Check'] = '在註冊時請選擇此欄位';
$lang['ANTISPAM_Check_Error'] = '[在註冊時請選擇此欄位] 這個欄位未選擇'; 
修改 includes/usercp_register.php, 找到下頭的內容
$passwd_sql = ''; 
在前頭加上
if ($mode == 'register') {
$x_hcode_date = $HTTP_POST_VARS['date'];
$hcode = $HTTP_POST_VARS[md5($x_hcode_date . ANTISPAM)];
$hcode_old = md5($x_hcode_date);
if (!isset($hcode) || empty($hcode) || $hcode != $hcode_old) {
$error = TRUE;
$error_msg .= ( ( isset($error_msg) ) ? '<br />' : '' ) . $lang['ANTISPAM_Error'];
}
if ( !isset($HTTP_POST_VARS['antispam_'.$hcode]) ) {
$error = TRUE;
$error_msg .= ( ( isset($error_msg) ) ? '<br />' : '' ) . $lang['ANTISPAM_Check_Error'];
}
}  
找到下頭的內容
$template->assign_vars(array( 
在前頭加上
$hcode_date = gmdate('U'); 
找到下頭的內容
'CONFIRM_IMG' => $confirm_image, 
在後頭加上
'HCODE' => md5($hcode_date),
'HCODENAME' => md5($hcode_date . ANTISPAM),
'DATE' => $hcode_date,
'L_ANTISPAM_CHECK' => $lang['ANTISPAM_Check'], 
修改 templates/subSilver/profile_add_body.tpl, 找到下頭的內容
<!-- Visual Confirmation --> 
在前頭加上
<input type="hidden" name="{HCODENAME}" value="{HCODE}" />
<input type="hidden" name="date" value="{DATE}" />
<tr>
  <td class="row1"><span class="gen">{L_ANTISPAM_CHECK}: * </span></td>
  <td class="row2"><input type="checkbox" name="antispam_{HCODE}" /></td>
</tr>  
經過這樣的修改後, 註冊時也可以使用同樣的方式來防止 bot 執行.
  • 在儲存文章之前, 如果是訪客或發文數在某個數字以下的使用者, 則使用 regexp 檢查內容.
修改 include/functions.php, 在第一個 function 之前, 加上下列這個 function
function check_myfilter($message, $fname = "myfilter")
{
global $phpEx, $phpbb_root_path;

$found = '';
$fp = @fopen($phpbb_root_path."includes/$fname.txt", 'rt');
if ($fp != 0) {
while (!feof($fp)) {
$rule = trim(fgets($fp, 1024));
if ($rule == '') continue;
if (preg_match($rule, $message)) {
$found = $rule;
break;
}
}
fclose($fp);
}
return $found;
}
接著修改 include/functions_post.php, 找到下列的內容
//
// Flood control
//
在這前頭加上
// check message
// only check for posts < 30 or guest
if ($userdata['user_id'] == ANONYMOUS || $userdata['user_posts'] < 30) {
$myfilter = check_myfilter($post_message);
if ($myfilter != '') {
message_die(GENERAL_MESSAGE, 'Message not allowed for token: '.$myfilter);
}
}
然後把你要阻擋的內容, 用 regexp 的方式寫在 include/myfilter.txt 內, 如下
/msi-team/i
/whymsi/i
/SEX ONLINE/i
/\[url=http:\/\/.*\.chatsms\.ru\]/i
/\.pharnu\.com/i
每行一個設定, 系統會在儲存之前, 檢查是否有你不要的內容的文章出現.
Del.icio.us Furl HEMiDEMi Technorati MyShare
commons icon [1] 請教... [ 回覆 ]

請教...
/msi-team/i/whymsi/i
/SEX ONLINE/i/\[url=http:\/\/.*\.chatsms\.ru\]/i
/\.pharnu\.com/i

這些是存為myfilter.txt檔名嗎?
再放到 include 裡面嗎?
謝謝 ^_^

commons icon [2] [ 回覆 ]

沒錯. 上頭的程式碼會讀取 include/myfilter.txt 這個檔案.

commons icon [3] 請教 [ 回覆 ]

請教tommy大大:
此程式修改,是否為圖片上-->
在註冊時請選擇此欄位: *
謝謝

commons icon [4] [ 回覆 ]

其中某一段是. (那一段? 裡頭有你問的那串字的那一段...)

commons icon [5] [ 回覆 ]

這邊還是來跟您謝謝
謝謝tommy大大幫忙!
讓我得以成功^_^

commons icon [6] Re:討厭的廣告 bot, 別再來我的 phpBB 了.... [ 回覆 ]

有使用的版本限制嗎?? 我的是 2.0.6 版!!

commons icon [7] Re:討厭的廣告 bot, 別再來我的 phpBB 了.... [ 回覆 ]

應該沒有版本的差別. 不過... 2.0.6 很舊了, 最好更新到最新的版本, 不然, 很容易就被取得 admin 的所有權. 網路上有一些小程式, 只要一跑, 要把那個 user 改成 admin 都可以.

commons icon [8] Re:討厭的廣告 bot, 別再來我的 phpBB 了.... [ 回覆 ]

謝謝您的回答!!

commons icon [9] Re:討厭的廣告 bot, 別再來我的 phpBB 了.... [ 回覆 ]

想在請問一下,之前使用效果真的很不錯,但是在PHP3中,是否可以使用呢??

commons icon [10] Re:討厭的廣告 bot, 別再來我的 phpBB 了.... [ 回覆 ]

phpbb3 應該不能直接用吧.
不過相同的邏輯是可以用的, 只是你要會 php 然後自己去改吧.

commons icon [11] Re:討厭的廣告 bot, 別再來我的 phpBB 了.... [ 回覆 ]

大大有打算造福大家嗎??...

PHP實在是看不太懂..!! 不知道要從哪邊加上去..

commons icon [12] Re:討厭的廣告 bot, 別再來我的 phpBB 了.... [ 回覆 ]

我沒接觸 phpbb3, 所以不知道要改那邊了.

commons icon [13] Re:討厭的廣告 bot, 別再來我的 phpBB 了.... [ 回覆 ]

請問有代工phpbb2.0 升級到3.0的服務嗎>

迴響
暱稱:
標題:
個人網頁:
電子郵件:
迴響

  

Bad Behavior 已經阻擋了 97 個過去 7 天試圖闖關的垃圾迴響與引用。
Power by LifeType. Template design by JamesHuang. Valid XHTML and CSS