1 頁 (共 1 頁)

減少這類的 bot 到 phpBB 來搗亂

發表於 : 2006-09-09 , 0:52
yehrussell
減少這類的 bot 到 phpBB 來搗亂

http://blog.teatime.com.tw/post/1/49

其實在後頭加上一個 checkbox, 讓使用者必須選取這個欄位才能註冊, 也能做到同樣的效果, 所以這個地方先移除不做了, 改用後頭的方式來防止.

參考 ANTISPAM 這個 MOD. 由於上頭對於時間的檢查, 似乎沒有必要, 所以我們修改一下, 只使用其中的概念, 在發文所使用的 form 上頭, 加上兩個用來檢查的欄位.

代碼: 選擇全部

##############################################################
## MOD Title: AntiSpam Mod
## MOD Author: deMone < mail@demone.net.ru > (Evgeny Neverov) http://evgeny.neverov.name
## MOD Description: Protects your forum from automatically dispatched spam
## MOD Version: 1.0.3
##
## Installation Level: EASY
## Installation Time: 3 minutes
## Files To Edit: posting.php
##		 includes/constants.php
##               templates/subSilver/posting_body.tpl
##		 language/lang_english/lang_main.php
## Included Files: n/a
## License: http://opensource.org/licenses/gpl-license.php GNU General Public License v2
##############################################################
## For security purposes, please check: http://www.phpbb.com/mods/ 
## for the latest version of this MOD. Although MODs are checked 
## before being allowed in the MODs Database there is no guarantee 
## that there are no security problems within the MOD. No support 
## will be given for MODs not found within the MODs Database which 
## can be found at http://www.phpbb.com/mods/
##############################################################
## Author Notes:
##
## Attention: if you use forms for a prompt reply (for example, quick_reply),
## add <input>-s code in a HTML-code of those template files
##
## Note: Instead of 冠ny text?(in "define"-command in includes/constants.php)
## specify some casual line - on its basis protection will
## beconstructed. Can use any word, number and in general
## any text, for example: jflc9v8bdfkkg
##############################################################
## MOD History:
##   2006-01-20 - Version 1.0.2
##        + initial release
############################################################## 
## Before Adding This MOD To Your Forum, You Should Back Up All Files Related To This MOD
##############################################################

#
#-----[ OPEN ]---------------------------------
#
posting.php

#
#-----[ FIND ]---------------------------------
#
$bbcode_uid = '';

#
#-----[ AFTER, ADD ]---------------------------------
#
			$hcode=$HTTP_POST_VARS[md5($userdata['username'] . $HTTP_POST_VARS['date'] . ANTISPAM)];
			if (isset($hcode) && !empty($hcode) && $hcode==md5($userdata['username'] . $userdata['user_regdate']) && (gmdate('U')-$HTTP_POST_VARS['date'])<600) {

#
#-----[ FIND ]---------------------------------
#
					submit_post($mode, $post_data, $return_message, $return_meta, $forum_id, $topic_id, $post_id, $poll_id, $topic_type, $bbcode_on, $html_on, $smilies_on, $attach_sig, $bbcode_uid, str_replace("'", "''", $username), str_replace("'", "''", $subject), str_replace("'", "''", $message), str_replace("'", "''", $poll_title), $poll_options, $poll_length);
				}

#
#-----[ AFTER, ADD ]---------------------------------
#
			} else message_die(GENERAL_MESSAGE, $lang['antispam']);

#
#-----[ FIND ]---------------------------------
#

'L_FONT_HUGE' => $lang['font_huge'], 

#
#-----[ AFTER, ADD ]---------------------------------
#

	'HCODE' => md5($userdata['username'] . $userdata['user_regdate']),
	'HCODENAME' => md5($userdata['username'] . gmdate('U') . ANTISPAM),

	'DATE' => gmdate('U'),

#
#-----[ OPEN ]---------------------------------
#
templates/subSilver/posting_body.tpl

#
#-----[ FIND ]---------------------------------
#

{ERROR_BOX}

#
#-----[ AFTER, ADD ]------------------------------------------
#

<input type="hidden" name="date" value="{DATE}" />
<input type="hidden" name="{HCODENAME}" value="{HCODE}" />

#
#-----[ OPEN ]---------------------------------
# You need to do this for all installed languages
#
language/lang_english/lang_main.php

#
#-----[ FIND ]---------------------------------
#
$lang['Found_search_matches'] = 'Search found %d matches'; // eg. Search found 24 matches

#
#-----[ AFTER, ADD ]------------------------------------------
# You need to do this for all installed languages
#
$lang['antispam'] = 'Mistake! There was an attempt of an automatic insert of the message in a forum. Your message is sent to hell. Try still times who knows - can it will turn out? Still probably, that you too long wrote the message - then pass to page back, copy the text, update page, insert the copied text and press button "Send".';

#
#-----[ OPEN ]---------------------------------
#
includes/constants.php

#
#-----[ FIND ]---------------------------------
#
define('MOD', 2);

#
#-----[ AFTER, ADD ]------------------------------------------
#
define('ANTISPAM', 'any text');

#
#-----[ SAVE/CLOSE ALL FILES ]---------------------------------
#
# EoM
修改 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, 

......未完...

Re: 減少這類的 bot 到 phpBB 來搗亂

發表於 : 2006-09-09 , 9:23
懸壺子
續上...........

如果有使用快速回應的 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 


每行一個設定, 系統會在儲存之前, 檢查是否有你不要的內容的文章出現.