図1●PHPスクリプトにより生成した円グラフ(PNGファイル)
図1●PHPスクリプトにより生成した円グラフ(PNGファイル)
[画像のクリックで拡大表示]

 今回は,PHP 5.1.2,4.4.2のリリースなど,PHP関連情報について紹介する。

PHPリリース関連情報

 今月は,PHP 4系ではPHP 4.4.2,PHP 5系ではPHP 5.1.2が相次いでリリースされている。以下,それらの修正内容および変更点に関して紹介する。今回のリリースにはセキュリティ上の問題に関する対策も含まれており,早期のバージョン更新が推奨されている。

PHP 5.1.2公開

 11月28日にPHP 5.1.1が公開されてから約1カ月半後の1月12日にPHP 5.1.2が公開された。このバージョンでは,セキュリティ上の問題の修正を含む多くのバグ修正と若干の機能追が行われている。これらの変更点のうち,まず,本バージョンで解消されたセキュリティ上の問題について以下に説明する。

1. header()関数における「HTTPレスポンス分割攻撃(HTTP Response Splitting Attack)」に対する脆弱性

 「HTTPレスポンス分割」とは,HTTPレスポンスヘッダーにCR+LFやContent-Length: 0を含めること一つのHTTPレスポンスを複数のHTTPレスポンスであるように偽装し,ブラウザやProxyのキャッシュに悪意のあるHTTPレスポンスヘッダーを残す攻撃手法である。

 これにより,この脆弱性を利用された場合,フィッシング詐欺などの被害が発生する可能性がある。この問題を回避するためには,HTTPレスポンスヘッダーの中にあるCR+LFをサニタイズする必要がある。本バージョンでは,header()関数の内部処理においてこのサニタイズ処理を追加し,安全性を向上させている。

2. エラー出力機能におけるクロスサイトスクリプティングの脆弱性

 PHPではエラー発生時にその内容を標準出力またはブラウザに出力する機能をサポートしている。その際,従来のバージョンではURLなどの入力パラメータがそのまま表示されるため,特定のエラー条件においてクロスサイトスクリプティングの脆弱性があった。本バージョンでは,パラメータ中のHTMLタグをエスケープするサニタイズ処理が追加された。

 上記のサニタイズ処理の実施は,従来,アプリケーション開発者の責任で行う必要があった。本バージョンでは,PHP本体の機能にこのサニタイズ処理を取り込むことで,開発者の負荷低減と処理の抜けを防止することができるようになっている。

 この他,MySQLiエクステンションにおけるフォーマット文字列処理のバグなど約85件のバグ修正が修正されている。

 主な機能追加としては,PECLで配布されていたエクステンションhashとXMLWriterが追加となり,標準設定で組み込まれるようになったことなどがあげられる。以下にPHP 5.1.2における機能追加および変更点について紹介する。

1.hashエクステンションの追加

 hashエクステンションは,ハッシュの作成を行うエクステンションであり,sha1,MD5,Tigerなど22種類のハッシュアルゴリズムがサポートされている。

 SHA1アルゴリズムによりメッセージ$msgのメッセージダイジェストを作成する例を以下に示す。

$digest = hash('sha1', $msg);
?>


 hash_algos()関数により,サポートされているアルゴリズムのリストを得ることができる。

print_r(hash_algos());
?>


 ハッシュ関数は,改竄の有無のチェックなどセキュリティに関する処理において必須となっている。MD5とSHA1などのアルゴリズムは,従来も組み込み関数として標準サポートされていたが,hashエクステンションでは,より高度なアルゴリズムが実装されており,ストリームなどもサポートされるなど機能が高いため,今後広く用いられることが予想される。

2.XMLWriterエクステンションの追加

 XMLWriterは,XML文書の作成を行うためのエクステンションである。XML文書を作成することが可能なエクステンションとしては,従来よりDOMとSimpleXMLがある。XMLWriterはデータをストリームとして処理することで高速に処理ができることを特徴としており,XMLデータの読込みを行うXMLReaderエクステンションの書き込み版に相当する。

 リスト1にXMLWriterによりXML文書を作成するコードの例を示す。

リスト1●XMLWriterのサンプル

$xml = new XMLWriter();

$xml->openUri('./test.xml');

$xml->setIndent(1);
$xml->setIndentString(' ');

$xml->startDocument('1.0', 'UTF-8');
$xml->startElement('書籍リスト');

$xml->startElement('本');
$xml->startAttribute('isbn');
$xml->text('4797331305');
$xml->endAttribute();
$xml->text('PHP5徹底攻略エキスパート編');
$xml->endElement();
$xml->endElement();

$xml->endDocument();
?>

 XMLWriterは,オブジェクト指向インタフェースと関数インタフェースの2種類をサポートしている。リスト1ではオブジェクト指向による記述を使用している。リスト1のスクリプトを実行すると,以下の内容のファイルtest.xmlが生成される。


<書籍リスト>
<本 isbn="4797331305">PHP5徹底攻略エキスパート編


 XMLWriterは,DOMで行っていた処理を高速化したい場合や,大量のXMLデータを作成したい場合などに適している。XMLWriterは,今後,PHPの標準的なXMLデータ生成用APIとして使用されていくことが予想される。

3.SimpleXMLの機能追加

 SimpleXMLは,XMLデータを容易に扱う仕組みとしてPHP5以降で導入されている。getNamespaces(),getDocNamespaces()メソッドが追加されることにより,従来はやや面倒だった名前空間に関する処理がより簡単になった。また,その他の機能強化も行われている。

4.mbstringの文字エンコーディング検出機能

 PHP 5.1.2では,mbstringエクステンションの文字エンコーディング検出機能において,より厳密な検出を行うモードを指定することが可能となった。

 具体的には,以下のように設定パラメータmbstring.strict_detection をOn (デフォルト:Off)にした場合には,このモードが有効となる。

mbstring.strict_detection = On


 また,mb_detect_encoding()関数の3番目の引数にtrueを指定することで,このモードを有効とすることができる。

$encoding = mb_detect_encoding($msg, "ASCII,JIS,UTF-8,EUC-JP,SJIS", true);


 このモードを有効にすると,文字エンコーディングを誤って検出するリスクは減るが,逆に文字列の長さが短い場合に文字エンコーディングを決定できない可能性は増える。用途・目的に応じて検出モードを使い分ける必要があるだろう。

 PHP 5.1.2では,この他,バンドルされているライブラリが更新されている。

  • sqliteエクステンションにバンドルされているlibsqliteが2.8.17に更新
  • pdo_sqliteエクステンションにバンドルされているlibsqliteが3.2.8に更新
  • Windows版アーカイブにバンドルされているlibxml2が2.6.22,libxsltが1.1.15に更新
  • PEARのバージョンが1.4.6に更新

     PHP 4の最新版 PHP 4.4.2にもセキュリティ上の問題に関する対策が含まれている。