CAPTCHAヘルパー
CAPTCHAヘルパーは「 system/helper/captcha_helper.php 」ファイルで、 人は読めるが、
機械に認識させるのが困難な「文字画像」を生成する関数が定義されています。
CAPTCHAヘルパーのロード
「 CI_Loader 」クラスの「 helper() 」メソッドでロードします。
CAPTCHAの準備
GDモジュール
「CAPTCHA」ヘルパーを利用するには、「GD」PHPモジュールが必要です。
RedHat系のLinuxでは、以下のようにインストールします。
画像保存ディレクトリ
CAPTCHA画像はファイルとして保存されるため、事前に、CAPTCHA画像をファイルとして出力する
ディレクトリを用意しておく必要があります。当然、Webサーバからの書き込み権限が必要です。
$ chmod 0777 htdocs/images/captcha
フォントファイル
フォントファイルを読み込ませることによって、CAPTCHA画像の中に表現する文字のフォントを変更することができます。 フォントファイルの指定は必須ではありませんが、デフォルトのフォントは見栄えが良くないので指定した方が良いでしょう。
RedHat系のLinuxでのフォントファイルのインストールは以下のようにします。
# 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パスを指定します。
第四引数は、もし「フォントファイル」を利用する場合は、「フォントファイル」のパスを指定します。
第二引数、第三引数、第四引数で指定する設定項目は、第一引数の連想配列に含めることができます。
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タイムスタンプ |
サンプル
- デフォルト
- word:
- time:
- image:
- 画像サイズ指定
- word:
- time:
- image:
- 文字列・フォント指定
- word:
- time:
- image:
$this->load->view('captcha', $data);
$info['img_height'] = 50;
$info['img_path'] = 'images/captcha/';
$info['img_url'] = '/images/captcha/';
$data['captcha'] = create_captcha($info);
$this->load->view('captcha', $data);
$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);
データ検証
CAPTCHA画像内の文字列とクライアントから送信されるFORMデータの検証には セッションを使うと良いでしょう。
- CAPTCHA生成
- 検証
'sess_match_ip' => TRUE,
'sess_expiration' => 7200,
);
$this->load->library('session', $config);
$info['img_url'] = '/images/captcha/';
$info['expiration'] = 7200;
$captcha = create_captcha($info);
$this->session->set_userdata('captcha', $captcha['word']);
$post_word = $this->input->post('word');
if ( strlen($post_word) > 0 && $sess_word === $post_word )
{
// OK
}