2012年5月13日日曜日

phpでフォームにCAPTCHA認証導入

適当につくっておいておいたサイト、スパムコメントがすごいことになっていたので、遅まきながらCAPTCHA認証導入しました。

CAPTCHA認証を実現するライブラリはいろいろあるようですが、今回は「Visual and Audio PHP CAPTCHA Generation Class」を利用しました。リンク先の中ほどの「You can download a zip file of the source code here.」リンクからダウンロードしたzipを解凍してphp-captcha.inc.phpをアップロードします。

また、認証画像内で使うフォントをfontディレクトリに保存しています。今回はこちらフォントを利用しました。

まずは認証画像作成用のコード

captcha.php

<?php
require_once "php-captcha.inc.php";

$font_list = array(
    '../font/Vera.ttf',
    '../font/VeraBd.ttf',
    '../font/VeraIt.ttf'
);

$captcha = new PhpCaptcha($font_list, 200, 60);

$captcha->CaseInsensitive(false);
$captcha->SetCharSet('A-Z,0-9');
$captcha->SetNumChars(7);
$captcha->UseColour(false);

$captcha->Create();
?>


フォントと、認証画像のサイズを指定してインスタンスを作成します。

$captcha = new PhpCaptcha($font_list, 200, 60);

大文字小文字の区別をするかどうかの設定。

$captcha->CaseInsensitive(false);

使用する文字の指定。

$captcha->SetCharSet('A-Z,0-9');

画像に現れる文字数の指定。

$captcha->SetNumChars(7);

カラーにするかモノクロにするかの設定。

$captcha->UseColour(false);

画像を表示したいところで、次のようにimgタグで上のファイルを読み込みます。

<form action="./judge_capcha.php" method="post" name="form">

  <p>画像認証</p>
   <img src="./parts/captcha.php" />
   <p>上の画像の文字を入力してください(ローマ字は大文字で入力してください)</p>
   <input name="chars" type="text" value="" /></p>
   <input type="submit" value="認証" />
</form>
呼び出し先で次のように認証の判断と、それぞれの場合の処理を記述します。。
<?php
mb_internal_encoding('UTF-8');
require_once "php-captcha.inc.php";

if (isset($_POST['chars'])) {
  if (PhpCaptcha::Validate($_POST['chars'], false)) {
    // 入力した文字が一致した場合の処理
    echo "OK";
  } else {
    // 入力しら文字が不一致だった場合の処理
    echo "NG";
  }
}
?>

セキュリティ周りは一度きちんと勉強しないといけないと思うのですが 最近はサイトを作ることも余り無いので優先順位が下がり放ったらかしになってしまっています。 良くないサイトを放置しているのは罪深いことは分かっているつもりなので時間作ります!

0 件のコメント:

コメントを投稿