PHPの魅力の一つは豊富にライブラリが用意されていることです。PHP最大のライブラリがPEARです。ここでは、PEARライブラリの一つ「Text_CAPTHA」を使ってみます。これを使う中で、PEARからライブラリの探し方から、自分のプログラムで使う方法などを紹介します。
掲示板などへ書き込む時に、スパムや迷惑書込などをされにくくするために、画像認証を行う場面があります。PEARのText_CAPTHAを使って、画像認証を使った掲示板を作ってみます。
簡単なメッセージを残せる掲示板を作りますが、画像認証(CAPTCHA)を用いて、スパムや迷惑書込などをされにくくしています。以下のプログラムを実行するためには、PEARの「Text_CAPTHA」がインストールされている必要があります。
file:bbs-captcha.php から抜粋
require_once "Text/CAPTCHA.php"; // CAPTCHAライブラリの取り込み ... session_start(); // セッションの開始 // 処理を分岐 $m = isset($_GET["m"]) ? $_GET["m"] : ""; if ($m == "write") { m_write(); } else { m_show(); } // ログの表示 function m_show() { global $savepath; show_form(); ... } // 書込フォームの表示 function show_form() { // セッションIDを元に画像ファイル名を決定 $captcha_png = "./captcha-img/".session_id().".png"; // CAPTCHAオブジェクトを生成 $cap = Text_Captcha::factory('Image'); $font_setting = array( // フォントの指定 'font_size' => 20, 'font_path' => './', 'font_file' => 'DroidSerif.ttf' ); $cap->init(300, 60, null, $font_setting); // 設定 $_SESSION['phrase'] = $cap->getPhrase(); // フレーズをセッションに保存 $png = $cap->getCAPTCHAAsPNG(); // CAPTCHA用の画像を取得 file_put_contents($captcha_png, $png); // 画像を保存 $self = $_SERVER["SCRIPT_NAME"]; echo <<< __FORM__ <form action="$self" method="get"> <input type="hidden" name="m" value="write" /> <div>名前: <input type="text" name="name" value="" size="20" /></div> <div>本文: <input type="text" name="body" value="" size="60" /></div> <div><img src="$captcha_png" /><br/> 上の文字を入力: <input type="text" name="captcha" value="" /></div> <div><input type="submit" value="書込" /></div> </form> __FORM__; } // ファイルへメッセージを保存 function m_write() { // パラメータの取得 ... $captcha = isset($_GET["captcha"]) ? $_GET["captcha"] : ""; ... // CAPTCHAが正しいかどうか判別する if ($_SESSION["phrase"] !== $captcha) { die("画像認証(CAPTCHA)に失敗。"); } // 追記保存 ... }
PEAR(PHP Extension and Application Repository)とは、PHPの拡張ライブラリ群です。
いろいろな拡張モジュールやアプリケーションが登録されており、ネットワーク経由で取得して利用することができます。PEARのライブラリ一覧を見るには、PEARのWebサイトを訪問するのが一番早いでしょう。画面上部のメニューから[Packages]をクリックすると、ライブラリのカテゴリを見ることができます。
PEAR http://pear.php.net/
必要なライブラリを探したいときには、このカテゴリから探すこともできますし、Webサイトの右上に検索ボックスもありますので、そこでキーワードを入れて検索することもできます。今回、作るプログラム「Text_CAPTHA」のライブラリを探すには、キーワードで検索してみるのが早いでしょう。(カテゴリから探すなら「トップ>Packages>Text>Text_CAPTCHA」とたどることもできます。)
PEARライブラリをインストールするには、コマンドラインからライブラリの自動インストールを行う方法が用意されています。
WindowsのXAMPPならば、コマンドラインを表示して、XAMPPのPHPフォルダ(c:\xampp\php)に移動して、PEARコマンドを使ってインストールを行います。
> cd c:\xampp\php ←PEARコマンドのあるディレクトリに移動 > pear install Text_CAPTCHA-0.4.3 ←ライブラリのインストール
自分の用意したWebサーバーならともかく、レンタルサーバーではPEARコマンドが使えない場合も多くあります。その場合は、PEARのライブラリをダウンロードして、通常のPHPファイルと同じように扱うこともできます。
以下の、Text_CAPTCHAの紹介ページを開きます。そして、[Download]のリンクをクリックします。すると、バージョン情報が表示されますので、Downloadの下のバージョン番号をクリックすると、アーカイブ一式をダウンロードできます。
Text_CAPTCHAの紹介ページ http://pear.php.net/package/Text_CAPTCHA
ダウンロードしたアーカイブはTGZ(TAR+GZIP)形式で圧縮されていますので、この形式に対応した解凍ソフトを使って、アーカイブを解凍します。(Windowsなら「+Lhacaデラックス版」などが有名です。)
そして、ダウンロードしたファイル一式を、今回作るサンプルと同じフォルダに配置します。そのとき、PEARの名前規則に則るため、以下のように、Textというフォルダを作り、その下に配置します。
加えて、Text_CAPTCHAは、別のPEARライブラリ「Text_Password」「Image_Text」にも依存していますので、このライブラリも同じようにダウンロードしてコピーを行う必要があります。
フォルダ構成:
+ <Text> | - CAPTCHA.php | - Password.php | - <CAPTHA> | | - <Driver> | | | - Equation.php | | | - Figlet.php | | | - ... + <Image> | - Text.php
このように、ダウンロードしてライブラリを配置するのは、依存するライブラリが多いとちょっと面倒ですが、出来ないことはありません。可能なら、PEARコマンドを利用してインストールすると良いでしょう。
また、画像認証(CAPTCHA)を行うために、適当なフリーフォント(TTF)を用意する必要があります。今回プログラム中で、フォントの指定を行う際に、以下のように指定しています。
$font_setting = array( // フォントの指定 'font_size' => 20, // フォントサイズ 'font_path' => './', // フォントの配置パス 'font_file' => 'DroidSerif.ttf' // フォントのファイル名 );
つまり、プログラムと同じフォルダに、DroidSeif.ttfという名前のフォントファイルを配置しています。フォントについては、Google Web Font (http://www.google.com/webfonts)から好きなフォントをダウンロードすることができます。ここでは、「Droid Serif」というフォントを使うことにしました。Apacheライセンスで比較的自由に使うことができます。
Droid Serif http://www.google.com/webfonts/family?family=Droid+Serif&subset=latin
さて、PEARライブラリから「Text_CAPTCHA」のインストールが無事済んだなら、いよいよライブラリを使いましょう。外部PHPファイルの取り込みには、「include」や「include_once」が使えるのでした。しかし、ライブラリの取り込みには、「require」や「require_once」を使うのが一般的です。
require_once "Text/CAPTCHA.php"; // CAPTCHAライブラリの取り込み
「include_once」と「require_once」の違いは、ライブラリの取り込み時にエラーがあるとその時点で処理を停止してくれるという部分です。ライブラリ利用時のトラブルを事前に防ぐ意味でも、require_onceを利用することをお勧めします。
画像認証用の画像を生成する処理を以下のように記述します。フォントの設定があるので、ちょっと複雑に見えるかもしれませんが、基本的には、CAPTCHAオブジェクトを生成し、init()メソッドでサイズやフォントを指定し、getCAPTCHAAsPNG()メソッドを使って画像を保存するという処理になっています。また、画像ファイルの中に描画した文字は、セッション変数に記憶しておきます。
// CAPTCHAオブジェクトを生成 $cap = Text_Captcha::factory('Image'); $font_setting = array( // フォントの指定 'font_size' => 20, 'font_path' => './', 'font_file' => 'DroidSerif.ttf' ); $cap->init(300, 60, null, $font_setting); // 設定 $_SESSION['phrase'] = $cap->getPhrase(); // フレーズをセッションに保存 $png = $cap->getCAPTCHAAsPNG(); // CAPTCHA用の画像を取得 file_put_contents($captcha_png, $png); // 画像を保存
生成して保存した画像は、そのあと、HTMLのフォームの中で、<img>タグを使って画像を表示します。
<form action="$self" method="get"> ... <div><img src="$captcha_png" /><br/> 上の文字を入力: <input type="text" name="captcha" value="" /></div> <div><input type="submit" value="書込" /></div> </form>
そして、画像認証に成功したかどうかを調べるには、セッションの保存された値と、ユーザーが入力した値が合致するかどうかを調べます。
$captcha = isset($_GET["captcha"]) ? $_GET["captcha"] : ""; ... // CAPTCHAが正しいかどうか判別する if ($_SESSION["phrase"] !== $captcha) { die("画像認証(CAPTCHA)に失敗。"); }
※ちなみに、「die("メッセージ")」は、メッセージを表示してPHPの実行を中断する関数です。
ここでは、PEARの利用例として、画像認証(CAPTCHA)の使い方を紹介しましたが、PEARには、認証やベンチマーク、コンソールから暗号化、HTTP通信や画像処理など、さまざまな処理を行うライブラリが用意されています。何か作るときには、使えるライブラリがないか調べてみると良いでしょう。