CAPTCHA(アンチスパム・イメージ)を使った認証

(1/2)
CAPTCHA(アンチスパム・イメージ) Web のユーザー登録画面などで、左のような画像に含まれている文字を入力させる場面がある。スパムによる自動入力を防止するための措置で、このような画像を「CAPTCHA*」(アンチスパム・イメージ)と呼んでいる。
今回は、PHP を使って CAPTCHA を発生させ、入力された文字が CAPTCHA 合致するかどうか、予想される攻撃にも配慮しつつ、プログラムを作ってみることにする。
CAPTCHA は、JpGraph がライブラリとしてサポートしているので、これを利用することにする。JpGraph の詳細については、以前の記事を参照のこと。

サンプル・プログラム

サンプル・プログラムは2つのソース・ファイルに分かれており、antispam_input.php の方を実行する。

プログラムを実行する

ダウンロード(PHP4/5共用)

サンプル・プログラムの解説:CAPTCHAを発生する

CAPTCHA を発生するのは antispam_image.php である。
このプログラムは、JpGraph の機能に依存している。まず、JpGraph のライブラリを読み込む。

0010: //JpGraph
0011: require_once("../../../../common/jpgraph/jpgraph_antispam.php");

次に、AntiSpam クラスの新しいインスタンスを作成する。
発生させる CAPTCHA をランダムに発生させるメソッド RandAntiSpam クラスに用意されている。引き数は発生する CAPTCHA の桁数である。また、表示できるイメージは半角数字・半角英小文字のみである。ただし、アルファベットの 'O' (オー)と数字の '0' (ゼロ) はよく似ており間違えやすいので、使われない。

0013: $col = 6;            //発生するアンチスパム画像の桁数
0014: 
0015: $spam = new AntiSpam();

CAPTCHA を発生するのは Stroke メソッドである。
これが失敗した場合にはエラー・メッセージを表示するようにしてある。
実際に表示する CAPTCHA を文字列データとして、関数  setcookie  を使って Cookie に入れておく。Cookie の寿命は 30秒間とした。
これにより、認証に使う文字列データはクライアントに渡されたことになる。以後、サーバ側では関知できず、サーバ攻撃を受けたとしても認証文字列データが漏れることはない。
space
なお、antispam_image.php は単独でも動作する。

0018: setcookie("AntiSpamChars", $charstime() + 30);  //30秒間有効なCookie
0019: 
0020: if ($spam->Stroke() == FALSE) {           //イメージ描画
0021:     die("Sorry - cannot draw image.");
0022: }

この項つづく
header