Awa Style.

四国の辺境で働く名もなきエンジニアの備忘録というか、覚書。技術以外のことも書きます。

画像認証を実装する

会員登録サイトを見ると画像認証を実装しているサイトをよく見かけます。

こういうやつです。
f:id:stmizuki01:20130711223327p:plain

CAPTCHAという技術らしいですが、PHPでは簡単に実装できるようです。
ここのサイトに纏められています。

数あるライブラリの中でLGPLライセンスということと手軽ということをどっかのサイトで見たのでKCAPTCHAというものを実装したいと思います。

 

  1. このサイトからダウンロードします。ダウンロードしたzipを解凍するといくつかのファイルが入っています。
  2. 解凍してできたフォルダを「kcaptcha」とリネームし、適当な場所に置きます。
    説明しやすいようにとりあえずドキュメントルートに置くことにします。
  3. セッションが使われていない場合は、session_start();を行っておきます。
  4. 画像を表示したい場所に以下のhtmlを記述します。
    <img src="<?php echo "./kcaptcha/index.php?".session_name()."=".session_id(); ?>" />
  5. 画像の文字は、セッションのキー「captcha_keystring」に保持されているので、POSTとか画面遷移されたタイミングでセッションに登録されている文字と画面の入力文字を比較して合否を判別します。

サンプルはこちら。

 

ちなみにソースはこんな感じになります。

<?php

session_start();

$url = "./kcaptcha/index.php?".session_name()."=".session_id();

// 認証

$result = "";

if (array_key_exists('keystring', $_POST)) {

if(isset($_SESSION['captcha_keystring']) && $_SESSION['captcha_keystring'] === $_POST['keystring']){

$result = "合ってる!!";

}else{

$result = "間違ってる!!";

}

}

?>

<html>

  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

  <head><title>KCAPCHAサンプル</title></head>

  <body>

    <form action="" method="post">

    <?php echo ($result == "" ? "" : "<p style=\"color:red;\">結果:".$result."</p>"); ?>

    <p>画像に書かれてある文字を入力してください。</p>

    <p><img id="image" src="<?php echo $url; ?>"></p>

    <p><input type="text" name="keystring"><input type="button" value="表示文字を変える" onclick="location.reload();" /></p>

    <p><input type="submit" value="Check"></p>

    </form>

  </body>

</html>

<?php

  unset($_SESSION['captcha_keystring']);

?>

kcaptchaのライセンスはLGPLv2orlaterらしいので、サービスに組み込む場合は注意が必要です。