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

CGIテクニック集トップへ





概要

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

必用な処理

  1. GD::SecurityImage::ACを読み込む
  2. GD::SecurityImage::ACのオブジェクトを作成する
  3. GD::SecurityImage(ACではない)へセキュリティイメージ作成のパラメータを渡す
  4. セキュリティイメージを作成する
  5. 作成されたイメージを表示する

サンプルコード

 use GD::SecurityImage::AC;
 
 my $captcha = GD::SecurityImage::AC->new;
 $captcha->gdsi(
               new => {
                   width => 230,
                   height => 80,
                   lines => 10,
                   scramble => 1,
                   font => "cour.ttf",
                   ptsize => 30,
               },
               create => ['ttf', 'rect', '#000000', '#555555'],
               particle => [500],
               );
 
 my $capdatadir = "capdata";
 $captcha->data_folder($capdatadir);
 $captcha->output_folder($capdatadir);
 $captcha->expire(5 * 60);
 
 my $md5sum = $captcha->generate_code(4);
 
 print "Content-Type: text/html\n\n";
 print "<img src=\"$capdatadir/$md5sum.png\">\n";

コードの解説

 use GD::SecurityImage::AC;

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

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

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

 $captcha->gdsi(
               new => {
                   width => 230,
                   height => 80,
                   lines => 10,
                   scramble => 1,
                   font => "cour.ttf",
                   ptsize => 30,
               },
               create => ['ttf', 'rect', '#000000', '#555555'],
               particle => [500],
               );

gdsiメソッドによりGD::SecurityImageへパラメータを渡します。widthは作成される画像の幅、heightは画像の高さ、linesは画像に挿入される線の数。画像の大きさに合わせて線の数を調整するとよいでしょう。scrambleはスクランブルモード。1でオンになります。この場合表示される文字が散らばるので文字数、文字サイズを見ながら画像サイズを大きめに設定しないと文字が画像からはみ出てしまいます。一文字に対して文字サイズの3倍を確保しないといけません。fontは使用するTrue Type Fontのファイル名。ドキュメントには絶対パスでファイル名を指定しないといけないとありますが相対パスでも動くようです。ptsizeはフォントのサイズ。 createは実際の画像(セキュリティイメージ)の設定。以下のように4つの引数を取ります。

   $captcha->create($method, $style, $text_color, $line_color);

$methodは、normalかttfを指定できます。normalはTrue Type Fontではない普通のフォントを使用。ttfはTrue Type Fontを使用します。 $styleはバックグランドのランダムイメージを指定し、以下の物が選べます。(古いGDではいくつか使えないものがあるかもしれません)

  • default : デフォルトスタイル。格子状の線と斜めの線が入ります。
  • rect : 格子状の線が入ります。
  • box : 二つの塗りつぶされた四角模様が入ります。内側の箱のサイズはnewで渡したlineパラメータで決まります。lineの数が大きいと内側の箱のサイズは小さくなります。
  • circle : 丸模様。
  • ellipse : 楕円模様。
  • ec : 丸と楕円の合成模様。

$text_colorは文字の色、$line_colorは線の色です。

particleは背景に散らばす点の密度になります。画像の大きさに合わせて調整するとよいでしょう。

 my $capdatadir = "capdata";
 $captcha->data_folder($capdatadir);
 $captcha->output_folder($capdatadir);
 $captcha->expire(5 * 60);

引き続きパラメータを指定します。画像を作成するフォルダとデータベースを作成するフォルダを指定します。この例ではどちらも同じcapdataというフォルダに保存します。このディレクトリは予め作成されていないといけません。data_folderがデータベースフォルダの指定。output_folderが画像を保存するフォルダの指定になります。 expireでその画像の有効期限を秒数で指定します。この例では5分となっています。画像が作成された後、その時間を越えると認証時にテキストは合致しても認証失敗となります。

 my $md5sum = $captcha->generate_code(4);

generate_codeメソッドによりセキュリティイメージ画像を作成します。引数は表示する文字数。ここでは4文字に設定しています。$md5sumには返り値であるMD5暗号化された128-bitの文字列が入ります。作成された画像はPNGフォーマットで$md5sum.pngというファイル名になります。この$mb5sumの値は認証時に必要になりますので<form>の<input type=hidden>等で次の処理に渡す必用があります。認証に関してはセキュリティイメージでの認証方法を参照してください。

 print "Content-Type: text/html\n\n";
 print "<img src=\"$capdatadir/$md5sum.png\">\n";

作成されたイメージを表示します。$capdatadirというフォルダに$md5sum.pngというファイルが作成されているのでそれをIMGタグで表示します。

認証スクリプトへ必用な値を渡すためには画像を表示する以外に以下のような入力フォームを含むコードが必要になります。

 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という名前になっています。

関連するCGIテクニック

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