アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

「文字識別」ではないCAPTCHA

こんにちは。CoCo一番のカレーを1食1辛ずつ上げていく事にチャレンジ中の亀本です。
前回6辛までいって、次回は7辛です。
さほど辛さに強くないので、そろそろ泣きそうです。ちなみに前回は食後に鼻血出しました。

今回はちょっとCAPTCHAのライブラリをあさってみました。
PHPで普通に文字画像識別によるCAPTCHAを実装するのであれば、
PEAR::Text_CAPTCHA
http://www.doyouphp.jp/sample/sample_others_captcha.shtml
や、Visual and Audio CAPTCHA
http://www.phppro.jp/phptips/archives/vol34/#1
といったものがあり、他にも
http://phpspot.org/blog/archives/2006/11/phpcaptcha.html
などでまとめられているように、数多くのライブラリが存在します。

これら文字画像識別のCAPTCHAは一般的ですが、そればかりでもつまらないので、少し変わったCAPTCHAを扱いたいなー、と思い、以下の2つのライブラリを使用してみました。

1.PEAR::Text_CAPTCHA_Numeral
http://pear.php.net/package/Text_CAPTCHA_Numeral
2つの数字による簡単な計算式を提示し、その計算結果を答えさせることで認証を行う、という仕組みのCAPTCHAライブラリです。

まずは、いつものごとくインストール


# pear install Text_CAPTCHA_Numeral


これを使って、簡単なサンプルを作成してみました。

numeral_ex.php:


<?php
require_once "Text/CAPTCHA/Numeral.php";
session_start();

if (isset($_POST["answer"])  & & $_POST["answer"]  & & isset($_SESSION["answer"])) {
  $message = ($_POST["answer"] == $_SESSION["answer"]) ? "認証OK" : "認証NG";
  unset($_SESSION["answer"]);
}

$numeral = new Text_CAPTCHA_Numeral();
$_SESSION["answer"] = $numeral->getAnswer();

?>
<html>
<head>
  <title>Text_CAPTCHA_Numeralサンプル</title>
</head>
<body>
  <h1>Text_CAPTCHA_Numeralサンプル</h1>
<?php if (isset($message)): ?>
  <p style="color:#FF0000;"><?php echo $message; ?></p>
<?php endif; ?>
  <form action="numeral_ex.php" method="post">
    次の計算結果を入力してください。
    <?php echo $numeral->getOperation(); ?>
    <input type="text" name="answer" value="" />
    <input type="submit" name="submit" value=" 認証 " />
  </form>
</body>
</html>


このライブラリは非常に小さく、publicなメソッドは、コンストラクタを除くと
getAnswer()
getOperation()
getFirstNubmer()
getSecondNumber()
の4つしかありません。
どれも単純な命名なので、使い方は名前から想像出来ますね。

普通の数字を用いるため、このままでは強度が高いとは言えない気もしますが、画像を使用せず、しかも容易にCAPTCHA認証が組み込めるのでちょっとしたところには便利だと思います。


2.Auth_Kitten
http://labs.cybozu.co.jp/blog/tsuruoka/anubis/blog_show/46
仔猫の画像を選択することで認証を行おう、という仕組みのライブラリです。

インストールはやっぱりいつもの如く



pear install http://labs.cybozu.co.jp/blog/tsuruoka/archives/Auth_Kitten-0.1.0.tgz


本当ならここで仔猫画像を集めなければいけませんが、このライブラリにはデフォルトで使用する素敵な猫画像がついていますので、これをそのまま使用します。

以下に簡単なサンプルを作成してみました。
# といっても、ほぼ配布元サイトと変わりませんが。。。(^^;

kitten.php:


<?php
require_once 'Auth/Kitten.php';

$kitten = new Auth_Kitten();

if (isset($_POST['submit'])  & & $_POST['submit']) {
  $message = $kitten->verify($_POST['kitten']) ? "認証OK" : "認証NG";
}

$html = $kitten->buildHtml('viewer.php?f=');

?>
<html>
<head>
  <title>Auth_Kitten サンプル</title>
</head>
<body>
  <h1>Auth_Kitten サンプル</h1>
<?php if (isset($message)): ?>
  <p style="color:#FF0000"><?php echo $message; ?></p>
<?php endif; ?>
  <form method="post">
    <?php echo $html; ?>
    <input type="submit" name="submit" value=" 認証 " />
  </form>
</body>
</html>



viewer.php(画像表示):


<?php
require_once 'Auth/Kitten.php';

$auth = new Auth_Kitten();

$photo = $auth->drawImage(basename($_GET["f"]));

echo $photo;
?>

これでkitten.phpにアクセスすると、こんな感じで仔猫認証フォームが生成されます。


仔猫画像は見ていても和みますし、実際のCAPTCHAとしての機能もなかなかのものです。
もちろん独自の画像も使用できますので、仔猫に限らず好みの画像認証が可能です。

その場合には、画像の入ったディレクトリ内に
kittin/
other/
という2つのディレクトリを用意し、その中にそれぞれOKの場合とNGの場合の画像を入れます。
そして、その画像ディレクトリをsetImagePathメソッドで指定してやれば利用可能です。
なお、その際にはファイル名はできるだけ重複しないようにして下さい。


様々なCAPTCHA認証がありますが、こんな一風変わったものも存在します。
何かの折に、使ってみると面白いかもしれません。