ついにコメントスパムが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
上記サイトを見てもらえばわかるんですが、おおまかな流れとしましては
- app/controller/captcha.phpでCAPTCHAコンポーネントを作成
- コンポーネントにvalidateCaptcha関数(上記サイト下部参照)を追加
- usersコントローラーもしくは適当なコントローラーにSession、Captchaコンポーネントを追加してcaptcha関数を追加(captcha関数の末尾にexit()必要?)
- CAPTCHAを利用したい箇所にIMGタグを導入
なんですが、あまりうまくいかなかったので下記に修正後コードを書いておきます。
IMGタグ
<img src="<?php echo $html->url('/users/captcha?r='.rand()); ?>" /><br />
<?php echo $form->
input('captchaText',
array('label'=>
'上記画像の文字列を記入してください(コメントスパム防止用)'));?>
IMGタグはcacheが残っていたので末尾にrand()を付けてみました。あと、$form->inputはCakePHP1.2系の関数ですので適宜直してください。
//validateCaptcha関数
function validateCaptcha
($fieldName,
$params =
array()) {
$name = $this->controller->name;
if(isset($params['name'])){
$name = $params['name'];
}
$val = $this->controller->data[$name][$fieldName];
define('captcha',
'kcaptcha');
if (!
empty ($_SESSION['captcha']) &&
$val ==
$_SESSION['captcha']) {
// clear to prevent re-use
unset ($_SESSION['captcha']);
return true;
}
return false;
}
/* モデルが固定では私の環境では不便だったので拡張しています
これで該当コントローラーで
if($this->Captcha->validateCaptcha('captchaText',array('name'=>'BlogComment'))){}
などとすれば動くはずです。*/
以上で簡単にCAPTCHAが導入できるかと思います。
もし不具合等ございましたらコメント等いただければ幸いです。