Tommy 碎碎念

Tommy Wu's blog

« 上一篇 | 下一篇 »

PHPBB 之訪客發文請點我, part II
post by tommy @ 01 十一月, 2006 11:18
話說自從在 phpBB2 的註冊訪客發文的 form 上頭, 加上一個自訂的 checkbox 之後, 就沒碰過有 bot 註冊成功的例子. 而訪客發文的部份, 一直也都沒碰到有成功的案例. 不過... 上星期發現有個 bot 居然成功的以訪客的身份發文. 難道... 這個是新的 bot, 專門對我修改的這個方法來處理嗎? 由於不太確定該 bot 是如何通過檢查的, 所以特地加上一些 log 來觀察所有訪客發文的記錄. 經過了幾天, 都還是只有看到舊型的 bot 來嘗試發文, 不過都無法通過. 不過... 今天終於看到了一個作法不同的 bot, 的確可以通過我之前的檢查.

之前的 bot, 在運作的時候, 會先抓取網站上頭的 form, 然後就存起來使用, 之後到該網站發文時, 並不會再次讀取網站的資料, 而是直接使用之前抓下來的 form 來發表文章 (因為之前修改的方式, 會加上一個 hidden 的欄位是 GMT 時間, 而依據這幾天的 log 來看, 絕大多數的 bot 居然這個欄位都是同一個時間). 這個 bot 只會填入一些標準的欄位, 因此, 我們新增加的 checkbox 的欄位, 在 post 之後, 那個變數並不會存在, 可以正確的阻擋這類的 bot.

不過, 後來看到另一種型式的 bot (不確定是否針對我們加上 checkbox 的作法, 還是原本這個 bot 就考慮的比較多一些), 看起來是比較即時的抓取 form 下來, 再送出 post 來發文 (因為上述的 GMT 時間欄位都很接近系統時間, 看起來很接近一般人用 browser 操作的模式), 而且, 送出的 post 內容中, 並非只有含有 phpBB 本身標準的欄位, 看起來是會把所有那個 form 上頭的欄位都傳回來, 自然之前的檢查方式, 只檢查是否有該變數存在時, 會通過檢查.

針對這個 bot 的作法, 修改一下我們之前的作法, 再加上另一個 checkbox, 也就是使用兩個額外的 checkbox, 要求使用者必須選取其中一個, 另一個則不要去選取.

整理一下, 修改的動作如下:

  • includes/constants.php

加上下面這行, 請修改字串內容, 不要直接使用這個範例, 這個值後頭會用來計算, 基本上選擇一個比較不容易被猜到的字串會比較好一些.

define('ANTISPAM', 'ANTISPAM Check!'); 
  • language/lang_chinese_traditional_taiwan/lang_main.php

加上這幾行:

$lang['ANTISPAM_Check'] = '請選擇此欄位';
$lang['ANTISPAM_NotCheck'] = '請勿選擇此欄位';
$lang['ANTISPAM_Check_Error'] = '[請選擇此欄位] 這個欄位未選擇 或 [請勿選擇此欄位] 這個欄位被選擇';
$lang['ANTISPAM_Timeout'] = '表單 逾時, 請再試一次!';
$lang['ANTISPAM_Error'] = 'ANTISPAM MOD 檢查失敗!';
  •  language/lang_english/lang_main.php

加上這幾行:

$lang['ANTISPAM_Check'] = 'Choose this!';
$lang['ANTISPAM_NotCheck'] = 'Don\'t choose this!';
$lang['ANTISPAM_Check_Error'] = '[Choose this!] not choose or [Don\'t choose this!] be chosen';
$lang['ANTISPAM_Timeout'] = 'Form timeout, Please try again!';
$lang['ANTISPAM_Error'] = 'ANTISPAM MOD check error!';

有關註冊時的修改:

  • includes/usercp_register.php

找到下頭的內容 (2007/03/25 修正, 只在註冊時顯示欄位):

$template->assign_block_vars('switch_confirm', array());

然後在這行之前加上:

$template->assign_block_vars('switch_antispam_choose', array());

找到下頭的內容:

        $passwd_sql = ''; 

然後在這行之前加上:

        if ($mode == 'register') {
$x_hcode_date = $HTTP_POST_VARS['date'];
$hcode_item = $HTTP_POST_VARS['antispam_item'];
if ($hcode_item == md5('1'.ANTISPAM.'1'.$x_hcode_date.'1')) {
$hcode_check = '1';
$hcode_notcheck = '2';
}
else {
$hcode_check = '2';
$hcode_notcheck = '1';
}
$now_date = gmdate('U');
if ($now_date >= $x_hcode_date)
$date_len = $now_date - $x_hcode_date;
else
$date_len = $x_hcode_date - $now_date;
$hcode = md5(ANTISPAM.$x_hcode_date);
$hcode_name = md5($x_hcode_date.ANTISPAM);
if (!isset($HTTP_POST_VARS[$hcode_name]) ||
empty($HTTP_POST_VARS[$hcode_name])) {
$error = TRUE;
$error_msg .= ( ( isset($error_msg) ) ? '<br />' : '' ) . $lang['ANTISPAM_Error'];
}
else if ($date_len > 86400) { // > 1 day?
$error = TRUE;
$error_msg .= ( ( isset($error_msg) ) ? '<br />' : '' ) . $lang['ANTISPAM_Timeout'];
}
else if ( !isset($HTTP_POST_VARS['antispam_'.$hcode_check.'_'.$hcode]) ||
$HTTP_POST_VARS['antispam_'.$hcode_check.'_'.$hcode] !== 'on' ||
isset($HTTP_POST_VARS['antispam_'.$hcode_notcheck.'_'.$hcode])) {
$error = TRUE;
$error_msg .= ( ( isset($error_msg) ) ? '<br />' : '' ) . $lang['ANTISPAM_Check_Error'];
}
}

找到下頭的內容:

        //
// Let's do an overall check for settings/versions which would prevent
// us from doing file uploads....
//
$ini_val = ( phpversion() >= '4.0.0' ) ? 'ini_get' : 'get_cfg_var';
$form_enctype = ( @$ini_val('file_uploads') == '0' || strtolower(@$ini_val('file_uploads') == 'off') || phpversion() == '4.0.4pl1' || !$board_config['allow_avatar_upload'] || ( phpversion() < '4.0.3' && @$ini_val('open_basedir') != '' ) ) ? '' : 'enctype="multipart/form-data"';

$template->assign_vars(array(
'USERNAME' => isset($username) ? $username : '',
'CUR_PASSWORD' => isset($cur_password) ? $cur_password : '',
'NEW_PASSWORD' => isset($new_password) ? $new_password : '',

在 $template->assign_vars(array( 之前, 加上下面幾行:

        $hcode_date = gmdate('U');
$hcode = md5(ANTISPAM.$hcode_date);
$hcode_name = md5($hcode_date.ANTISPAM);
$hcode_random = rand(1,100) % 2;
if ($hcode_random == 1) {
// 1 on, 2 off
$hcode_item = md5('1'.ANTISPAM.'1'.$hcode_date.'1');
$hcode_lang1 = $lang['ANTISPAM_Check'];
$hcode_lang2 = $lang['ANTISPAM_NotCheck'];
}
else {
// 1 off, 2 on
$hcode_item = md5('2'.ANTISPAM.'2'.$hcode_date.'2');
$hcode_lang1 = $lang['ANTISPAM_NotCheck'];
$hcode_lang2 = $lang['ANTISPAM_Check'];
}

然後在 'NEW_PASSWORD' => isset($new_password) ? $new_password : '', 這行後面加上這幾行:

                'HCODE' => $hcode,
'HCODENAME' => $hcode_name,
'HCODE_ITEM' => $hcode_item,
'L_ANTISPAM_CHECKBOX1' => $hcode_lang1,
'L_ANTISPAM_CHECKBOX2' => $hcode_lang2,
'DATE' => $hcode_date, 
  • templates/subSilver/profile_add_body.tpl

找到下頭的內容:

        <!-- Visual Confirmation --> 

然後在這行上面加上這幾行 (2007/03/25 修正, 只在註冊時顯示):

    <!-- BEGIN switch_antispam_choose --> 
<input type="hidden" name="{HCODENAME}" value="1" />
<input type="hidden" name="date" value="{DATE}" />
<input type="hidden" name="antispam_item" value="{HCODE_ITEM}" />
<tr>
<td class="row1"><span class="gen">{L_ANTISPAM_CHECKBOX1}: * </span></td>
<td class="row2"><input type="checkbox" name="antispam_1_{HCODE}" /></td>
</tr>
<tr>
<td class="row1"><span class="gen">{L_ANTISPAM_CHECKBOX2}: * </span></td>
<td class="row2"><input type="checkbox" name="antispam_2_{HCODE}" /></td>
</tr>
<!-- END switch_antispam_choose -->

接著是有關於訪客發文的修改:

  • posting.php

找到下頭的內容:

                        $bbcode_uid = '';

prepare_post($mode, $post_data, $bbcode_on, $html_on, $smilies_on, $error_msg, $username, $bbcode_uid, $subject, $message, $poll_title, $poll_options, $poll_length); 

在 $bbcode_uid = ''; 之後加上這幾行:

                        $hcode_date = $HTTP_POST_VARS['date'];
$hcode_item = $HTTP_POST_VARS['antispam_item'];
if ($userdata['user_id'] == ANONYMOUS) {
$hcode = md5(ANTISPAM.$hcode_date);
$hcode_name = md5($hcode_date.ANTISPAM);
}
else {
$hcode = md5(ANTISPAM.$hcode_date.$userdata['username'].$userdata['user_regdate']);
$hcode_name = md5($userdata['username'].$hcode_date.ANTISPAM);
}

if ($hcode_item == md5('1'.ANTISPAM.'1'.$hcode_date.'1')) {
$hcode_check = '1';
$hcode_notcheck = '2';
}
else {
$hcode_check = '2';
$hcode_notcheck = '1';
}

$now_date = gmdate('U');
if ($now_date >= $hcode_date)
$date_len = $now_date - $hcode_date;
else
$date_len = $hcode_date - $now_date;

if (!isset($HTTP_POST_VARS[$hcode_name]) ||
empty($HTTP_POST_VARS[$hcode_name])) {
$error_msg = $lang['ANTISPAM_Error'];
}
else if ($userdata['user_id'] == ANONYMOUS &&
$date_len > 86400) { // > 1 day?
$error_msg = $lang['ANTISPAM_Timeout'];
}
else if ($userdata['user_id'] == ANONYMOUS &&
(!isset($HTTP_POST_VARS['antispam_'.$hcode_check.'_'.$hcode]) ||
$HTTP_POST_VARS['antispam_'.$hcode_check.'_'.$hcode] !== 'on' ||
isset($HTTP_POST_VARS['antispam_'.$hcode_notcheck.'_'.$hcode])) ) {
$error_msg = $lang['ANTISPAM_Check_Error'];
}
else 

找到下頭的內容:

//
// This enables the forum/topic title to be output for posting
// but not for privmsg (where it makes no sense)
//
$template->assign_block_vars('switch_not_privmsg', array());

//
// Output the data to the template
//
$template->assign_vars(array(
'USERNAME' => $username,
'SUBJECT' => $subject,
'MESSAGE' => $message, 

在 $template->assign_vars(array( 這行之前, 加上這幾行:

$hcode_date = gmdate('U');
if ($userdata['user_id'] == ANONYMOUS) {
$hcode = md5(ANTISPAM.$hcode_date);
$hcode_name = md5($hcode_date.ANTISPAM);
}
else {
$hcode = md5(ANTISPAM.$hcode_date.$userdata['username'].$userdata['user_regdate']);
$hcode_name = md5($userdata['username'].$hcode_date.ANTISPAM);
}
$hcode_random = rand(1,100) % 2;
if ($hcode_random == 1) {
// 1 on, 2 off
$hcode_item = md5('1'.ANTISPAM.'1'.$hcode_date.'1');
$hcode_lang1 = $lang['ANTISPAM_Check'];
$hcode_lang2 = $lang['ANTISPAM_NotCheck'];
}
else {
// 1 off, 2 on
$hcode_item = md5('2'.ANTISPAM.'2'.$hcode_date.'2');
$hcode_lang1 = $lang['ANTISPAM_NotCheck'];
$hcode_lang2 = $lang['ANTISPAM_Check'];

然後在 'MESSAGE' => $message, 這行後面加上這幾行:

        'HCODE' => $hcode,
'HCODENAME' => $hcode_name,
'HCODE_ITEM' => $hcode_item,
'L_ANTISPAM_CHECKBOX1' => $hcode_lang1,
'L_ANTISPAM_CHECKBOX2' => $hcode_lang2,
'DATE' => $hcode_date, 
  • templates/subSilver/posting_body.tpl

找到下頭的內容:

{POST_PREVIEW_BOX}
{ERROR_BOX} 

在這之後加上這幾行:

<input type="hidden" name="date" value="{DATE}" />
<input type="hidden" name="{HCODENAME}" value="1" />
<input type="hidden" name="antispam_item" value="{HCODE_ITEM}" /> 

找到下頭的內容:

        <!-- BEGIN switch_username_select -->
<tr>
<td class="row1"><span class="gen"><b>{L_USERNAME}</b></span></td>
<td class="row2"><span class="genmed"><input type="text" class="post" tabindex="1" name="username" size="25" maxlength="25" value="{USERNAME}" /></span></td> 

在上頭最後一行的 </span></td> 之前, 加上這幾行:

<input type="checkbox" name="antispam_1_{HCODE}" />{L_ANTISPAM_CHECKBOX1}
<input type="checkbox" name="antispam_2_{HCODE}" />{L_ANTISPAM_CHECKBOX2} 

這樣子, 在發文的時候也會檢查.

另外, 如果有安裝快速回應之類的 MOD, 也要做下頭的修改:

  • viewtopic.php

找到下頭的內容:

//
// If we've got a hightlight set pass it on to pagination,
// I get annoyed when I lose my highlight after the first page.
//
$pagination = ( $highlight != '' ) ? generate_pagination("viewtopic.$phpEx?" . POST_TOPIC_URL . "=$topic_id&postdays=$post_days&postorder=$post_order&highlight=$highlight", $total_replies, $board_config['posts_per_page'], $start) : generate_pagination("viewtopic.$phpEx?" . POST_TOPIC_URL . "=$topic_id&postdays=$post_days&postorder=$post_order", $total_replies, $board_config['posts_per_page'], $start);

//
// Send vars to template
//
$template->assign_vars(array(
'FORUM_ID' => $forum_id,
'FORUM_NAME' => $forum_name,
'TOPIC_ID' => $topic_id,
'TOPIC_TITLE' => $topic_title, 

在 $template->assign_vars(array( 之前加上這幾行:

$hcode_date = gmdate('U');
if ($userdata['user_id'] == ANONYMOUS) {
$hcode = md5(ANTISPAM.$hcode_date);
$hcode_name = md5($hcode_date.ANTISPAM);
}
else {
$hcode = md5(ANTISPAM.$hcode_date.$userdata['username'].$userdata['user_regdate']);
$hcode_name = md5($userdata['username'].$hcode_date.ANTISPAM);
}
$hcode_random = rand(1,100) % 2;
if ($hcode_random == 1) {
// 1 on, 2 off
$hcode_item = md5('1'.ANTISPAM.'1'.$hcode_date.'1');
$hcode_lang1 = $lang['ANTISPAM_Check'];
$hcode_lang2 = $lang['ANTISPAM_NotCheck'];
}
else {
// 1 off, 2 on
$hcode_item = md5('2'.ANTISPAM.'2'.$hcode_date.'2');
$hcode_lang1 = $lang['ANTISPAM_NotCheck'];
$hcode_lang2 = $lang['ANTISPAM_Check'];

然後在 'TOPIC_TITLE' => $topic_title, 之後, 加上這幾行:

        'HCODE' => $hcode,
'HCODENAME' => $hcode_name,
'HCODE_ITEM' => $hcode_item,
'L_ANTISPAM_CHECKBOX1' => $hcode_lang1,
'L_ANTISPAM_CHECKBOX2' => $hcode_lang2,
'DATE' => $hcode_date, 
  • templates/subSilver/viewtopic_body.tpl

找到下頭的內容:

      <!-- BEGIN switch_username_field -->
<span class='gensmall'><b>{L_USERNAME}</b></span><br />
<span class='genmed'><input type='text' class='post' tabindex='1' name='username' size='25' maxlength='25' value='' /></span><br />

在上頭最後一行的 </span><br /> 之前, 加上這幾行:

<input type="hidden" name="antispam_item" value="{HCODE_ITEM}" />
<input type="checkbox" name="antispam_1_{HCODE}" />{L_ANTISPAM_CHECKBOX1}
<input type="checkbox" name="antispam_2_{HCODE}" />{L_ANTISPAM_CHECKBOX2}

找到下頭的內容:

      <!-- BEGIN quick_reply -->
<textarea name="message" rows="7" cols="35" wrap="virtual" style="width:425px" class="post" onclick="{if(document.quick_reply.message.value=='{L_QUICK_REPLY_TOPIC}') document.quick_reply.message.value=''}">{L_QUICK_REPLY_TOPIC}</textarea><br /> 

在這之後加上這幾行:

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

這樣子修改後, 應該可以避免一些 bot 來註冊或使用訪客的身份來發文了. 至少... 那個 bot 必須要看的懂 form 上頭的文字, 選取應該選取的 checkbox, 並且不可以選擇不應該選的 checkbox, 才會通過這個檢查.


2007/03/25:

修正一下, 只在註冊時顯示那些欄位. (上頭紅色部份)

Del.icio.us Furl HEMiDEMi Technorati MyShare
commons icon [1] 無私分享 [ 回覆 ]

感謝無私分享

commons icon [2] [ 回覆 ]

感謝分享,測試中

commons icon [3] [ 回覆 ]

您好,感謝您提供了這個這麼好的東西。 :)
我昨天剛裝了這個來用,結果今天還是有未註冊的訪客帳號貼了廣告文。請問我該怎麼檢查問題出在哪?謝謝……(拜)

敝站的位置是 http://otakus.dyndns.org/phpBB2/ ,如能得到您的協助,真的是非常感謝!

commons icon [4] [ 回覆 ]

我剛剛試著去發了一篇文. 並沒有限制.
看起來像是 posting.php 中在 prepare_post() 之前的檢查沒改好吧. 看起來並沒有執行到那一段檢查的程式就通過了?
另外, 貴站在快速回覆的那地方也有問題, 訪客在快速回覆時並沒有要求輸入確認碼, 但是存檔前又會檢查一次.

commons icon [5] [ 回覆 ]

謝謝您的協助,原來真的是您說的地方沒改好。
現在已經正常運作了,真是太感激了!

關於快速回覆的地方沒辦法輸入驗證碼的問題,我們一直在研究要怎麼改,不好意思。 ^^;

commons icon [6] nice [ 回覆 ]

很不错啊
请问你的这个绿色的code标签怎么做的啊?
能否给点提示?
\

commons icon [7] [ 回覆 ]

這個 blog 用的 style.css 打開來看一下就知道了. 在最前頭有關 pre 的設定就是了.

commons icon [8] oncemore [ 回覆 ]

[code]oh,这样啊
有点不可思议
[/code]

commons icon [9] [ 回覆 ]

最近被垃圾發言搞得很痛苦
嘗試您說的方法之後,文章變成無法發表
出現的是 " ANTISPAM MOD 檢查失敗!" 不知要從何下手

commons icon [10] [ 回覆 ]

會有那個錯誤訊息, 表示沒改好. 至於那邊沒改好... 自己上頭的地方一個個比對一下吧.

commons icon [11] [ 回覆 ]

您好,在下就是兩個月前來求助的那位小斌。

自從裝了這個以後,這兩個月來,已經再也沒有看到過任何一篇廣告文了。這個 MOD 真的是既簡單又非常有效!!除了大力推薦以外,還要再次感謝 tommy ,謝謝您做了這個。 :D

commons icon [12] 謝 [ 回覆 ]

非常謝謝. 待我試試看..

commons icon [13] Re:PHPBB 之訪客發文請點我, part II [ 回覆 ]

大大你好
用了你了這個MOD之後效果很不錯
有點想法
那個選擇欄註冊時會出現
可是註冊成功後進入個人資料裡檢視還是會出現
我的想法是,既然註冊成功了,那兩個欄位就沒有出現的必要了嘛

不知道是不是我有改掉什麼地方,請大指正,謝謝

commons icon [14] Re:PHPBB 之訪客發文請點我, part II [ 回覆 ]

我上頭有關註冊的地方有修改了兩個小地方, 這樣子應該可以只在註冊時顯示那兩個欄位.

commons icon [15] Re:PHPBB 之訪客發文請點我, part II [ 回覆 ]

感謝大大的快速回覆
沒有仔細看別的部分
是不是公增加了模板
$template->assign_block_vars('switch_antispam_choose', array());
和tpl裡的
部分呀
我測試後已經達到想要的效果

再次感謝大大的無私幫助

commons icon [16] Re:PHPBB 之訪客發文請點我, part II [ 回覆 ]

對, 就是那兩個部份而已.

commons icon [17] Re:PHPBB 之訪客發文請點我, part II [ 回覆 ]

今天才裝上
過一個月來向大大匯報使用情況

謝謝

commons icon [18] Re:PHPBB 之訪客發文請點我, part II [ 回覆 ]

LifeType 1.2 有點小 bug, 會吃掉 & 字元, 所以上頭的文章有點亂掉, 由備份檔抓回舊的再改一下.
基本上, 上頭有兩個紅色的部份是今天加上的, 改了之後, 應該就只會在註冊時顯示那些欄位.

commons icon [19] Re:PHPBB 之訪客發文請點我, part II [ 回覆 ]

您好感謝您的分享
想請教以下此句的意思

加上下面這行, 請修改字串內容, 不要直接使用這個範例, 這個值後頭會用來計算, 基本上選擇一個比較不容易被猜到的字串會比較好一些.

不知道是改哪邊?可否舉個例呢?萬分謝意!

commons icon [20] Re:PHPBB 之訪客發文請點我, part II [ 回覆 ]

那是指 ANTISPAM 這個定義的內容可以自己隨便設定一個字串.
define('ANTISPAM', 'ANTISPAM Check!');

commons icon [21] Re:PHPBB 之訪客發文請點我, part II [ 回覆 ]

非常感謝您!

commons icon [22] Re:PHPBB 之訪客發文請點我, part II [ 回覆 ]

Tommy 您好,又來打擾了。 :)
我覺得這種修改方式實在是太讚了,應該是目前所有 BOT 阻擋方案中最強的。真希望能多推廣呀!

請問 Tommy 是否考慮將這個修改方式寫成正式的 MOD 來發佈呢(我自己就有把這些修改方式寫成 MOD 語法給 EasyMDO 用)?這樣就會有更多人能知道這個好東西了~

commons icon [23] Re:PHPBB 之訪客發文請點我, part II [ 回覆 ]

来汇报使用情况
近一个多月来,效果非常之好
谢谢大大了

另外,不知大大是否有时间改下这个MOD,让它支持PHPBB2.0.22呢,非常期待呀
Insert Attachment Into Post v1.0.2 (插入圖像附件到文章指定地
http://www.phpbb-tw.net/phpbb/viewtopic.php?t=40357
http://phpbb-tw.net/phpbb/viewtopic.php?p=234936&highlight=#234936

commons icon [24] Re:PHPBB 之訪客發文請點我, part II [ 回覆 ]

版主大大:有兩個問題麻煩幫我看一下!!
1.我安裝後,測試註冊能更正常判斷,但是我再以會員登入時,發表文章,有勾跟沒勾似忽都沒有效果...

2.若以訪客發言時,會員名稱會出現一組,下方發文資料時也會出現一組,這樣是正確的嗎??

我的版本是 2.0.20 沒有裝快速回應的MOD

commons icon [25] Re:PHPBB 之訪客發文請點我, part II [ 回覆 ]

應該有重複一組吧.
正常會員登入後的發文不會有. 而訪客的發文會有一組, 不是兩組.
應該是 posting_body.tpl 的 checkbox 重複一組了吧.

commons icon [26] Re:PHPBB 之訪客發文請點我, part II [ 回覆 ]

會重複, 也許是之前 part I 改了一次, 到 part II 又改了一次的關係?

commons icon [27] Re:PHPBB 之訪客發文請點我, part II [ 回覆 ]

我給您我的網址 麻煩幫我看一下!!
http://www.yunlin.com.tw/phphbb2/

給您一組帳號 E3E32E2/123456

麻煩了!!

commons icon [28] Re:PHPBB 之訪客發文請點我, part II [ 回覆 ]

我剛剛進去看. 第一次進去時, 只有一組 checkbox, 並沒有問題.
後來換一篇文章, 就都沒有 checkbox 了. 也許是你剛好在改東西吧.
剛剛發文前再看一次, 又回到只有一組的情形了.

commons icon [29] Re:PHPBB 之訪客發文請點我, part II [ 回覆 ]

對了, 忘了我剛剛是有登入的情形. 沒有出現那組 checkbox 才是正常的.
那個是在訪客身份時才出現.
應該是加在 BEGIN switch_username_select 後頭那一段輸入訪客姓名的那兒才對.

commons icon [30] Re:PHPBB 之訪客發文請點我, part II [ 回覆 ]

請問一下,checkbox應該是在會員名稱後方還是在下方,看起來應該是在會員名稱後面
不過在
的前加入checkbox,會員登入不就不會顯示了..??
您可以用訪客PO文章再第二個討論區 系統問題處理區
看看位置,目前不會改資料!!

commons icon [31] Re:PHPBB 之訪客發文請點我, part II [ 回覆 ]

那表示只要通過註冊,就不會有確認問題是嗎??

commons icon [32] Re:PHPBB 之訪客發文請點我, part II [ 回覆 ]

在訪客輸入會員名稱的後面那個才是對的 (當然位置也可以自己改).
輸入文章下頭的那個就移除掉吧.

commons icon [33] Re:PHPBB 之訪客發文請點我, part II [ 回覆 ]

對, 基本上認為註冊成功的會員就不會是 bot. (因為註冊時也會有類似的處理)
在程式中, 也只會針對訪客去處理, 有登入的就不管.

commons icon [34] Re:PHPBB 之訪客發文請點我, part II [ 回覆 ]

那我應該算安裝好了,麻煩大大囉!!
希望不會再被貼廣告了...!!
還有蠻多MOD要安裝..@_@ 不過大大的是首選!!
風評很好!!

commons icon [35] Re:PHPBB 之訪客發文請點我, part II [ 回覆 ]

這個外掛,是我在 phpbb2 裡面,最喜歡、最實用的外掛了!
請問有 phpbb3 版嗎?

commons icon [36] Re:PHPBB 之訪客發文請點我, part II [ 回覆 ]

我也想請問,作者有開發 phpBB3 的版本嗎?謝謝!

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

迴響

  

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