老實說,這應該是不被允許的行為  ... 還是分享一下。

我現在改的這個版本是 vbulletin 2.2.2,因為版本老舊加上不會再花錢升級,所以只好用「手動」的方式來新增驗證碼的功能。

今天研究一下 vbulletin 的架構,它把每一頁的 HTML 都存在資料庫裡的 template table 裡面,這時才瞭解原來 vbulletin 如果被 hack 改掉首頁的話,就是因為資料庫被改掉了,難怪復原的方式就只要把資料庫再倒回去就好了。

要在註冊頁面產生驗證碼的話,首先一定要有一個產生亂數圖型的程式,程式碼如下,將它全部複製起來另外存成一個名叫 show_vaildcode.php ,同時上傳到 vbulletin 的目錄下。

<?php
session_start();

if($act == "init")
{
        Header("Content-type:  image/png");
        srand(microtime()  *  100000);
        $login_check_number = strval(rand("11111","99999"));

        session_register("login_check_number");

        $h_img  =  imagecreate(48,17);
        $c_black  =  ImageColorAllocate($h_img,  0,0,0);
        $c_white  =  ImageColorAllocate($h_img,  255,255,255);
        imageline($h_img,  1,  1,  350,  25,  $c_black);
        imagearc($h_img,  200,  15,  20,  20,  35,  190,  $c_white);
        imagestring($h_img,  5,  2,  1,  $login_check_number,  $c_white);
        ImagePng($h_img);
        ImageDestroy($h_img);

        die();
}
?>


接下來我們要來去修改一下資料庫裡面的 template table。
可以直接用 phpMyAdmin 下 SQL 指令來修改

SQL 指令1 :
update template
set template = '請確定您已完成了所有要求的表單. 這些包括用戶名, 密碼, E-mail 和驗證碼. 請按返回鍵, 更改錯誤後再重試一次.'
where title = 'error_fieldmissing
'

SQL 指令2 :
INSERT INTO `template` (
`templateid` ,
`templatesetid` ,
`title` ,
`template`
)
VALUES (
NULL , '-1', 'error_vaildcodemismatch', '您的驗證碼不符合. 請按上一頁,修正您的錯誤.'
);


第三個 SQL 太長,找到 template table 欄位 title 為 registeradult 的資料後,再去編輯 template 欄位,找到
<tr>
    <td bgcolor="{secondaltcolor}"><normalfont><b>請再確認一次 E-mail:</b></normalfont></td>
    <td bgcolor="{secondaltcolor}"><normalfont><input type="text" class="bginput" name="emailconfirm" size="25" maxlength="50"></normalfont></td>
</tr>


在後面加上
<tr>
    <td bgcolor="{firstaltcolor}"><normalfont><b>請輸入驗證碼:</b></normalfont></td>
    <td bgcolor="{firstaltcolor}"><normalfont><input type="text" class="bginput" name="vaildcode" size="25" maxlength="5"></normalfont></td>
</tr>
<tr>
    <td bgcolor="{firstaltcolor}"></td>
    <td bgcolor="{firstaltcolor}"><img src=show_vaildcode.php?act=init></td>
</tr>

最後按下儲存即可 ~ 資料庫的部份就到此結束。

接下來編輯 register.php 這個檔案,要編輯二個地方。找到
if ($email!=$emailconfirm) {
    eval("standarderror(\"".gettemplate("error_emailmismatch")."\");");
    exit;
  }


在後面加上
if ($vaildcode!=$login_check_number) {
    eval("standarderror(\"".gettemplate("error_vaildcodemismatch")."\");");
    exit;
  }


然後再找到
if ($username=="" or $email=="" or $emailconfirm=="" or $password=="" or $passwordconfirm=="") {

把它改成
if ($username=="" or $email=="" or $emailconfirm=="" or $password=="" or $passwordconfirm=="" or $vaildcode=="") {

存檔離開後,把 register.php 上傳到原本的地方覆蓋過去。

大功告成!

bojack 發表在 痞客邦 留言(0) 人氣()