院生エンジニアのにっき

  • Change style to Blue
  • Change style to Red
  • Change style to Green
  • Change style to Pink

CAPTCHA機能付けました   2007-09-24

ついにコメントスパムが500件を突破してしまい放っておけない状況になったのでCAPTCHA機能を付けました。

ちなみにCAPTCHAとは、「Completely Automated Public Turing test to tell Computers and Humans Apart」の略だそうです(Wikipedia Captcha)。まぁ要するにコンピュータによる自動コメント投稿をはじくための画像認証機構です。

今回はCakePHPでのCAPTCHA機能の付け方についてです。

PHPで使えるCAPTCHAライブラリを探してみたらPHPで使えるCAPTCHA画像作成ライブラリまとめなんてのがあったのでKCAPTCHAを利用することに決定。

ブログシステムのコントローラーにかりかりとロジックを書いている最中にふとComponentがないか探したら発見!

Integrate CakePHP with Kcaptcha

上記サイトを見てもらえばわかるんですが、おおまかな流れとしましては

  1. app/controller/captcha.phpでCAPTCHAコンポーネントを作成
  2. コンポーネントにvalidateCaptcha関数(上記サイト下部参照)を追加
  3. usersコントローラーもしくは適当なコントローラーにSession、Captchaコンポーネントを追加してcaptcha関数を追加(captcha関数の末尾にexit()必要?)
  4. CAPTCHAを利用したい箇所にIMGタグを導入

なんですが、あまりうまくいかなかったので下記に修正後コードを書いておきます。

  1. IMGタグ
  2. <img src="<?php echo $html->url('/users/captcha?r='.rand()); ?>" /><br />
  3. <?php echo $form->input('captchaText',array('label'=>'上記画像の文字列を記入してください(コメントスパム防止用)'));?>

IMGタグはcacheが残っていたので末尾にrand()を付けてみました。あと、$form->inputはCakePHP1.2系の関数ですので適宜直してください。

  1. //validateCaptcha関数
  2. function validateCaptcha($fieldName, $params = array()) {
  3.         $name = $this->controller->name;
  4.         if(isset($params['name'])){
  5.                 $name = $params['name'];
  6.         }
  7.         $val = $this->controller->data[$name][$fieldName];
  8.         if (!defined('captcha'))
  9.                 define('captcha', 'kcaptcha');
  10.         if (!empty ($_SESSION['captcha']) && $val == $_SESSION['captcha']) {
  11.                 // clear to prevent re-use
  12.                 unset ($_SESSION['captcha']);
  13.                 return true;
  14.         }
  15.         return false;
  16. }
  17. /* モデルが固定では私の環境では不便だったので拡張しています
  18.    これで該当コントローラーで
  19.    if($this->Captcha->validateCaptcha('captchaText',array('name'=>'BlogComment'))){}
  20.    などとすれば動くはずです。*/

以上で簡単にCAPTCHAが導入できるかと思います。

もし不具合等ございましたらコメント等いただければ幸いです。


コメントを書く
  • (2008 09/15(月) 01:50)
  • (2009 01/15(木) 06:48)
  • (2009 09/20(日) 04:26)