このエントリーをはてなブックマークに追加

更新日: 2016年2月25日

実行時間: 0.0080

CAPTCHAヘルパー

 CAPTCHAヘルパーは「 system/helper/captcha_helper.php 」ファイルで、 人は読めるが、
機械に認識させるのが困難な「文字画像」を生成する関数が定義されています。

CAPTCHAヘルパーのロード

 「 CI_Loader 」クラスの「 helper() 」メソッドでロードします。

    $this->load->helper('captcha');

CAPTCHAの準備

GDモジュール

 「CAPTCHA」ヘルパーを利用するには、「GD」PHPモジュールが必要です。

 RedHat系のLinuxでは、以下のようにインストールします。

    # yum install php53-gd
    または、
    # yum install php-gd

画像保存ディレクトリ

 CAPTCHA画像はファイルとして保存されるため、事前に、CAPTCHA画像をファイルとして出力する
ディレクトリを用意しておく必要があります。当然、Webサーバからの書き込み権限が必要です。

    $ mkdir htdocs/images/captcha
    $ chmod 0777 htdocs/images/captcha

フォントファイル

 フォントファイルを読み込ませることによって、CAPTCHA画像の中に表現する文字のフォントを変更することができます。 フォントファイルの指定は必須ではありませんが、デフォルトのフォントは見栄えが良くないので指定した方が良いでしょう。

 RedHat系のLinuxでのフォントファイルのインストールは以下のようにします。

    # yum install fonts-japanese
    # yum install ipa-gothic-fonts ipa-mincho-fonts
    # yum install ipa-pgothic-fonts ipa-pmincho-fonts

 フォントファイルは「/usr/share/fonts/」ディレクトリ配下に、拡張子「.ttf」としてインストールされます。


CAPTCHAヘルパーの関数

create_captcha($data = '', $img_path = '', $img_url = '', $font_path = '')

 CAPTCHA画像を生成するのに必要な情報を受け取り、画像ファイルを作成したら 指定した「文字列」「有効期限」「HTMLの<img>タグ」の情報を配列で返します。

 第一引数には、連想配列でCAPTCHAの生成に必要な情報を指定します。NULLを 指定するとデフォルト値が利用されます。
 第二引数は、CAPTCHA画像を保存するディレクトリパスを指定します。
 第三引数は、「<img>」タグの「src=""」属性にセットする画像のURLパスを指定します。
 第四引数は、もし「フォントファイル」を利用する場合は、「フォントファイル」のパスを指定します。

 第二引数、第三引数、第四引数で指定する設定項目は、第一引数の連想配列に含めることができます。

    $captcha = create_captcha(NULL, 'images/captcha/', '/images/captcha/');
    print_r($captcha);
    /*
    Array
    (
        [word] => abc
        [time] => 1338272152.16456100
        [image] => <img src="/images/captcha/1338272152.16456100.jpg" width="150"
                                            height="30" style="border:0;" alt=" " />
    )
                            
    */

設定情報

 以下の7つの設定情報を利用することができますが、最低限必要な設定情報は「img_path」「img_url」になります。

項目 デフォルト 説明
word ランダム8文字 CAPTCHA画像内に表現する文字列を指定します。
日本語などのマルチバイト文字は利用できません。
デフォルトでは「数値」と「アルファベット(小文字・大文字)」からランダムに
8文字で生成されます。
img_path CAPTCHA画像を保存するディレクトリパス
ドキュメントルートからの相対パスか絶対パスで指定します。
img_url 「<img>」タグの「src=""」にセットするURI(ディレクトリ)パス
img_width 150 CAPTCHA画像の横幅(px)
img_height 30 CAPTCHA画像の高さ(px)
font_path フォントファイルパス
expiration 7200 CAPTCHA画像の有効時間(秒)

戻り値

 CAPTCHA画像の生成に成功すると、create_captcha()関数は、以下の項目の連想配列を返します。
 CAPTCHA画像の生成に失敗するとFALSEを返します。

項目 説明
word CAPTCHA画像内で表現されている文字列
image HTML「 <img> 」タグ
time 有効期限 マイクロ秒単位のUnixタイムスタンプ

サンプル

    • デフォルト
    $data['captcha'] = create_captcha(NULL, 'images/captcha/', '/images/captcha/');
    $this->load->view('captcha', $data);
    <?php echo $captcha['image']; ?>
  • word:
  • time:
  • image:

    • 画像サイズ指定
    $info['img_width'] = 180;
    $info['img_height'] = 50;
    $info['img_path'] = 'images/captcha/';
    $info['img_url'] = '/images/captcha/';
    $data['captcha'] = create_captcha($info);
    $this->load->view('captcha', $data);
    <?php echo $captcha['image']; ?>
  • word:
  • time:
  • image:

    • 文字列・フォント指定
    $info['word'] = 'CodeIgniter';
    $info['img_width'] = 200;
    $info['img_path'] = 'images/captcha/';
    $info['img_url'] = '/images/captcha/';
    $info['font_path'] = '/usr/share/fonts/ipa-gothic/ipag.ttf';
    $data['captcha'] = create_captcha($info);
    $this->load->view('captcha', $data);
    <?php echo $captcha['image']; ?>
  • word:
  • time:
  • image:

データ検証

 CAPTCHA画像内の文字列とクライアントから送信されるFORMデータの検証には セッションを使うと良いでしょう。

    $config = array(
        'sess_match_ip' => TRUE,
        'sess_expiration' => 7200,
    );
    $this->load->library('session', $config);
  • CAPTCHA生成
  • $info['img_path'] = 'images/captcha/';
    $info['img_url'] = '/images/captcha/';
    $info['expiration'] = 7200;
    $captcha = create_captcha($info);

    $this->session->set_userdata('captcha', $captcha['word']);
  • 検証
  • $sess_word = $this->session->userdata('captcha');
    $post_word = $this->input->post('word');

    if ( strlen($post_word) > 0 && $sess_word === $post_word )
    {
        // OK
    }