PHPプロ!TIPS+

1. Visual and Audio CAPTCHAクラスでCAPTCHA画像作成

Webサイトのフォームから値を送信した相手がユーザなのか、ハッカーのスクリプトの仕業なのかを判断する場合、画像による認証機能は有効な方法の1つです。一般的に、文字を歪ませた画像をユーザに提示し、そこに書かれた文字列を入力させることで認証を行います。

今回は、CAPTCHAを実装するためのVisual and Audio CAPTCHAクラスを紹介します。

Visual and Audio CAPTCHA(以下、PhpCaptcha)はEdoward Eliot氏のサイト
http://www.ejeliot.com/pages/php-captcha)において公開されており、CAPTCHA画像のみならず、音声ファイルも作成可能です。ただし、画像ファイルを作成するにはフォントファイルへのパスを指定しなければなりません。

ここではhttp://www.gnome.org/fonts/からダウンロードしたTrue Typeフォントを使います。これらをfontsディレクトリ以下に保存し、さっそくCAPTCHA画像を作ってみましょう。

<?php
mb_internal_encoding
('EUC-JP');
require_once 
"php-captcha.inc.php";

$font_list array(
    
'fonts/VeraBd.ttf'
  
'fonts/VeraIt.ttf'
  
'fonts/Vera.ttf'
);

$captcha = new PhpCaptcha($font_list20060);
$captcha->Create();
?>

使用するフォントと画像サイズを指定してオブジェクトを生成し、Createメソッドにより画像を出力します。

上記のコードでは以下のような画像が出力されます。

CAPTCHA画像

画像内の文字列はセッションへ格納され、Validateメソッドを使うことで入力文字列を判定します。この画像を認証フォームのIMGタグから読み込み、フォームから送信された文字列を確認してみましょう。

<?php
mb_internal_encoding
('EUC-JP');
require_once 
"captcha/php-captcha.inc.php";

if (isset(
$_POST['chars'])) {
  if (
PhpCaptcha::Validate($_POST['chars'], false)) {
    
// 正規の処理
  
} else {
    
// エラー処理
  
}
}
?>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP" />
</head>
<body>
<img src="/phptips/sample/captcha2.php" />
<form method="post" action="<?php echo $_SERVER['SCRIPT_NAME']; ?>">
  <input type="text" name="chars" value="" />
  <input type="submit" name="submit_send" value="送信する" />
</form>
</body>

IMGタグで画像を読み込んだ際に、セッションへ文字列が格納されます。フォームから文字列が送信されれば、Validateメソッドでセッション内の文字列と一致するかを判定しています。

ただし、上記のコードでは画像はアルファベットの大文字5文字で構成され、Validateメソッドは大文字と小文字を区別しません。画像内でこれらの文字を使い、大文字・小文字を区別することも簡単に実行できます。

Createメソッドを使う前に下記のように設定します。

<?php
// 大文字・小文字を区別する
$captcha->CaseInsensitive(false);

// 画像に大文字・小文字・数字を用いる
$captcha->SetCharSet('a-z,A-Z,0-9');

// 画像に表示する文字数を7文字にする
$captcha->SetNumChars(7);
?>

出力画像は次のようになります。

CAPTCHA画像

判定側スクリプトでは、Validateメソッドの第2引数にfalseを指定することで、大文字・小文字を区別します。この他にも背景の線を変えたり、背景自体を変えることも可能です。画像作成のスクリプトはとても簡単ですので、機会があれば使ってみてはいかがでしょうか。

2. PHPのGDライブラリで日本語フォントを美しく描画する方法

PHPでよく使われる、グラフィック用ライブラリのGD。FreeTypeサポートを有効にしておくと、日本語TrueTypeフォントと共に使用すると、日本語を表示することができるため、重宝されている方も多いのではないでしょうか。

しかし、FreeTypeを使用するときに問題となるのが、その品質です。以下の図を見てみてください。これは、CentOS4標準のFreeTypeライブラリを使用して、6~16pxのIPA明朝体を使った文字列を描画したものです。

6px-IPA明朝体(パッチ前)
10px-IPA明朝体(パッチ前)
12px-IPA明朝体(パッチ前)
16px-IPA明朝体(パッチ前)

英語のフォントは綺麗に出ていますが、日本語のフォントはあまり美しいとは言えません。特に、フォントサイズが小さくなると、このように切れ目が出てしまいます。
もともとFreeTypeライブラリが欧米で育ったこともあり、日本語のアンチエイリアスのアルゴリズムが洗練されていないのが原因です。

これを改善するために、パッチを当てたFreeTypeを使用する方法があります。

今回使用したパッチは、KDEのフォント環境を更に充実させようで公開されているFreeType 2.1用のパッチです。

こちらのパッチを当てると、先ほどの画像は以下のようになります。

6px-IPA明朝体(パッチ後)
10px-IPA明朝体(パッチ後)
12px-IPA明朝体(パッチ後)
16px-IPA明朝体(パッチ後)

いかがでしょうか?だいぶ見た目が変わり、良い感じに日本語が表示されたと思います。

ただ、こちらのパッチを当てたFreeTypeを作成することは、簡単ではありません。
そこで、CentOS 4.4(RHEL4でも動くかな)向けのRPMを公開しますので、ぴったり環境がマッチするひとは、このパッケージを使ってみてください(ただし自己責任でお願いいたします)。

AutoHintを有効にしたRPMをダウンロードする

バックナンバーについて

TIPS-MLは、毎週金曜日に更新され、新しい記事が掲載されます。

Tipsꗗy[W 

Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)