2012-11-11

在 CodeIgniter 使用圖形驗證

◎方式一: 使用內建的 CAPTCHA Helper
   在使用手冊中, 建議用 DB 來記錄 captcha word; 個人是比較習慣使用 session 來記錄, 這樣可以省掉 DB 的操作。步驟:

1. 在 controller 類別的建構式中載入 CAPTCHA Helper 和 SESSION Class。
$this->load->library('session');
$this->load->helper('captcha');

2. 建立一個目錄用來暫存 captcha 圖片, 注意該目錄必須設定為 writeable。以下的範例是在 document root 建立名為 captcha 的目錄, 目錄裡的圖形檔過期後會自動被刪除。

3. 在 controller 類別中定義產生圖形的方法:
    private function captcha_img() 
    {
        $pool = '0123456789';
        $word = '';
        for ($i = 0; $i < 4; $i++){
            $word .= substr($pool, mt_rand(0, strlen($pool) -1), 1);
        }
        $this->session->set_userdata('captcha', $word);
        $vals = array(
            'word'  => $word,
            'img_path'  => './captcha/',
            'img_url'  => $this->data['baseURL'] . 'captcha/',
            'expiration' => 1200
            );
        $cap = create_captcha($vals);
        return $cap['image'];
    }
●   $word 為亂數產生的字串, 可以自訂產生的方式。
●   接著將 $word 值設定到 session 存起來, 以方便之後的比對。
●   $vals 為建立 captcha 時的設定:
   ○   word: 欲顯示的文字
   ○   img_path: 暫存圖形的目錄
   ○   img_url: 圖形目錄的 URL
   ○   expiration: 過期的時間, 單位為秒
●   $cap['image'] 會是包含圖片路徑的 <img> 標籤的字串

4. 比對驗證碼:
$this->input->post('captcha') == $this->session->userdata('captcha')

 CAPTCHA Helper 優點是使用起來方便, 不需額外安裝其它外掛; 缺點是較為陽春, 預設大小為 150 * 30, 外觀幾乎不能用設定方式更改。

◎方式二: 整合 Securimage
   參考: http://czetsuya-tech.blogspot.tw/2009/08/how-to-integrate-securimage-captcha-to.html

1. 到 http://www.phpcaptcha.org/ 下載 Securimage。

2. 並將整個 securimage 目錄複製到 application\libraries 裡。


3. 在 controller 類別中定義產生圖形的方法:
    private function captcha_img() 
    {
        return '<img src="' . $this->data['siteURL'] . 'signup/securimage_jpg" />';
    }

    public function securimage_jpg() 
    {
        $this->load->library('securimage/securimage');

        $img = new Securimage();

        //Change some settings
        $img->image_width = 125;
        $img->image_height = 40;
        $img->perturbation = 0.85;
        $img->image_bg_color = new Securimage_Color("#f6f6f6");
        $img->use_transparent_text = true;
        $img->text_transparency_percentage = 30; // 100 為全透明
        $img->num_lines = 0;
        $img->use_wordlist = true; 

        $img->show('backgrounds/bg6.jpg'); // 套背景圖並顯示
    }


4. 比對驗證碼 ( 寫在 controller 類別的方法裡 ):
        $this->load->library('securimage/securimage');
        $img = new Securimage();
        if( $img->check( $this->input->post('captcha') ) ) {
                // ...
        }

Securimage 提供的功能比 CAPTCHA Helper 多, 且方便設定。


沒有留言:

FB 留言