CodeIgniter3でCAPTCHAを表示する

CodeIgniter3でCAPTCHAを表示するときのメモ。

CAPTCHAとは

CAPTCHA(キャプチャ)は チャレンジ/レスポンス型テストの一種で、応答者がコンピュータでないことを確認するために使われる。 CAPTCHA - Wikipedia

基本的にはコンピュータが認識できないような文字などを表示して、その内容を入力させることで入力者が人間であることを確認します。画像認識の技術が向上してる現在では単純な文字のみのCAPTCHAは破られる可能性があります。

captchaの使用例

ブルートフォースアタック(Brute force attack)と呼ばれる総当りの攻撃を防ぐために利用されます。

CodeIgniter3でCAPTCHAを使用する

CodeIgniter3にはCAPTCHAヘルパーが存在し、単純なCAPTCHAならすぐに実装することが出来ます。

画像を生成する

ヘルパーを読み込み、create_captcha()関数を実行して画像を生成します。
生成する画像の情報は引数に設定します。

$this->load->helper('captcha');
$captcha = create_captcha([
  'img_path' => APPPATH.'/captcha/',
  'img_url' => '/captcha/img/',
  'font_path' => APPPATH.'/fonts/kiki.ttf',
  'img_width' => "150",
  'img_height' => 30,
  'expiration' => 7200,
  'word_length' => 8,
  'font_size' => 16,
  'colors' => [
    'background' => [255, 255, 255],
    'border' => [255, 255, 255],
    'text' => [0,0,0],
    'grid' => [255,40,40],
  ]
]);

上で作成した画像の戻り値は以下のようになります。

array(4) { ["word"]=> string(8) "0gCOHRf1" ["time"]=> float(1476259560.6607) ["image"]=> string(98) "<img src="/captcha/img/1476259560.6607.jpg" style="width: 150; height: 30; border: 0;" alt=" " />" ["filename"]=> string(19) "1476259560.6607.jpg" }

戻り値の中のwordが今回生成された文字列、imageが生成された画像のタグ、filenameがファイル名となります。

文字列をセッションに保存する

入力された文字列とのチェックのため、wordをセッションに保存しておきます。

$this->load->driver('session');
$this->session->set_userdata('captcha', $captcha['word']);

画像を表示する

imageをhtmlに出力します。
Twigテンプレートを使用して出力しています。 mikawatan.hatenablog.com

$this->load->library('twig');
$this->twig->display('index.twig', ['captcha' => $captcha['image']);

imgタグをそのまま出力するためrawを指定して出力します。

<p>{{captcha|raw}}</p>

これで画像が表示されるので、後は入力された値とセッションに保存された値をチェックする処理をいれれば完了です。

まとめ

CodeIgniter3を利用すれば単純なCAPTCHA画像であればすぐに作成できます。