XOOPS 計算式驗證碼之 hack 版

點閱:460 平均評分:尚無評分 迴響:0
作者:睡蓮 來源:池水間
有見本站會員及正體中文站會員對註冊驗證碼模式的需求,本文分享池水間之 hack版中文混數字之計算驗證碼,是在 text 模式基礎上 hack 出來的版本,在此之前本站原是用陽春型圖型模式驗證碼的。

hack 版text 模式
text mode

此 hack 於去年7月開始在 XOOPS 2.33b 的池水間上先行試驗了幾個月,確定效果顯著,到升級為 XOOPS 2.56 後沿用此 hack 至今,由 hack 前每天出現幾個垃圾帳號,到 hack 後連一個垃圾帳號也沒有,而真正註冊使用者至今倒有陸續註冊成功。

一般註冊頁面上我們所見的計算式驗證碼是數字 + 數字 = ?數字 - 數字 = ?,當中的 + - 符號機器人會爬到,而本 hack 的目的就是不讓機器人去爬得 + - 符號,但又讓真正註冊使用者知道要用什麼來計算,加上是中文網站,會員對象是中港台,用中文字是不二之選。

來看看原始 xoops/class/captcha/text.php 檔中的函數:
    function loadText()
    {
        $val_a = rand(0, 9);
        $val_b = rand(0, 9);
        if ($val_a > $val_b) {
            $expression = "{$val_a} - {$val_b} = ?";
            $this->code = $val_a - $val_b;
        } else {
            $expression = "{$val_a} + {$val_b} = ?";
            $this->code = $val_a + $val_b;
        }
        return '<span style="font-style: normal; font-weight: bold; font-size: 100%; font-color: #333; border: 1px solid #333; padding: 1px 5px;">'.$expression.'</span>';
    }

上面可以知道若隨機數(最小0最大9) a 大於 b 用減數,反之用加數,而 $expression 是我們在頁面上會見到的計算題,$this->code 是我們看不見的背後計算碼。

這樣下來知道如何 hack 自己想要呈現的計算題吧?

以池水間呈現的計算題為例,要先 加/減 然後乘之。

先 加/減 的,用括號括起來,接著後面用星號乘之,此為計算碼,而頁面上所見的除數字外,符號全不秀出來,改用中文表達之。

    function loadText()
    {
        $val_a = rand(0, 999);
        $val_b = rand(0, 99);
        $val_c = rand(0, 9);
        if ($val_a > $val_b) {
            $expression = "先以{$val_a}減去{$val_b}再乘以{$val_c}是多少";
            $this->code = ($val_a - $val_b) * $val_c;
        } else {
            $expression = "先以{$val_a}加上{$val_b}再乘以{$val_c}是多少";
            $this->code = ($val_a + $val_b) * $val_c;
        }
        return $expression;
    }

改好後以無 BOM utf8 編碼存檔便可,XOOPS 2.3至2.55版本的還要多改一檔 xoops/class/captcha/config.php,將裡面的 'mode' => 'image' 改為 'mode' => 'text'。