セキュリティイメージでの認証方法

CGIテクニック集トップへ





概要

CAPTCHAによるセキュリティイメージからの情報を基に認証します。 メッセージボード5ディスカッションフォームメールで使われています。 セキュリティイメージ作成に関してはセキュリティイメージの作り方を参照してください。

必用な処理

  1. GD::SecurityImage::ACを読み込む
  2. GD::SecurityImage::ACのオブジェクトを作成する
  3. データベースフォルダの設定をする
  4. 渡されたテキスト文字列とMD5文字列を基にコードをチェックする
  5. 結果に従って適切な処理をする

サンプルコード

 use GD::SecurityImage::AC;
 
 my $captcha = GD::SecurityImage::AC->new;
 
 my $capdatadir = "capdata";
 $captcha->data_folder($capdatadir);
 
 my $result = $captcha->check_code($in{intext},$in{capmd5});
 
 if ($result == 0){
     die "コードのチェックに失敗しました。";
 } elsif ($result == -1){
     die "コードの有効期限が過ぎています。";
 } elsif ($result == -2){
     die "無効なコードです。";
 } elsif ($result == -3){
     die "コードがマッチしません。";
 }

コードの解説

まず、セキュリティイメージを持つ入力フォームから値がこのコードを持つスクリプトへ渡されていることが前提です。入力フォームには以下のようなコードが存在するはずです。

 print "<form action=\"capcheck.cgi\" method=\"post\">\n";
 print "<img src=\"$capdatadir/$md5sum.png\"><br>\n";
 print "<input type=\"hidden\" name=capmd5 value=\"$md5sum\">\n";
 print "投稿するためには上の文字を下のテキストボックスに入力してください<br>";
 print "<input type=\"text\" name=intext size=10><p>\n";
 print "</form>\n";

この例では認証スクリプトはcapcheck.cgiという名前になっています。 詳しくはセキュリティイメージの作り方を参照してください。

 use GD::SecurityImage::AC;

GD::SecurityImage::ACを読み込みます。このモジュールは本来古いAuthen::Captchaの置き換えとして作られたもので、ドキュメントにはGD::SecurityImageを直接操作することが望ましく、このモジュールを使うことは推奨できないと書かれています。しかしながらこのモジュールにはGD::SecurityImageへのインターフェースが用意されていて非常に便利なのでここでは利用しています。

 my $captcha = GD::SecurityImage::AC->new;

GD::SecurityImage::ACのオブジェクトを作成します。

 my $capdatadir = "capdata";
 $captcha->data_folder($capdatadir);

データベースフォルダの設定をします。このフォルダは画像生成する際に設定したデータベースフォルダと同じものでなければいけません。

 my $result = $captcha->check_code($in{intext},$in{capmd5});

事前に$in{intext}に入力フォームからのテキスト、$in{capmd5}にhiddenで渡されたMD5文字列が入っていると仮定します。それらをcheck_codeメソッドのパラメータとして渡します。その結果は$resultに入ります。$resultの値は、

   1 : 認証成功
   0 : チェック失敗(ファイルエラー)
  -1 : 認証エラー コードの有効期限満了
  -2 : 認証エラー 無効なコード(データベースにコードが無い)
  -3 : 認証エラー 無効なコード(文字列がセキュリティイメージと合わない)

のいずれかになります。

 if ($result == 0){
     die "コードのチェックに失敗しました。";
 } elsif ($result == -1){
     die "コードの有効期限が過ぎています。";
 } elsif ($result == -2){
     die "無効なコードです。";
 } elsif ($result == -3){
     die "コードがマッチしません。";
 }

結果に従って適切な処理を行ってください。

関連するCGIテクニック

セキュリティイメージの作り方