図1●ベンチマークテスト結果の例 (Fedora Core 4,Athlon 1.2GHz)
図1●ベンチマークテスト結果の例 (Fedora Core 4,Athlon 1.2GHz)
[画像のクリックで拡大表示]
図2●HTMLフォームの入力チェックを行うスクリプトの実行例
図2●HTMLフォームの入力チェックを行うスクリプトの実行例
[画像のクリックで拡大表示]

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

著しく速いPHP 5.1.0

 PHP 5の最新版であり数カ月にわたりテストが行われていたPHP 5.1.0がついに11月24日に正式リリースされた。このバージョンでは後述する$GLOBALS変数を外部から上書きされる可能性があるという重大なセキュリティ上の問題など,400件以上のバグが修正されるとともに,実行速度向上などの機能・性能強化が行われている。

PHP 5.1.0の不具合を修正したPHP 5.1.1リリース

 ただしPHP 5.1.0のリリース直後,PHP 5.1で新たに追加された組込みクラス定義がPEAR のDateパッケージと干渉するという問題が明らかになった。この問題およびPHP 5.1.0のリリース後にみつかった複数のバグを修正するため,PHP 5.1.1が急遽 11月29日にリリースされている。

 PHP 5.1の新機能については本連載で何回か紹介しているが,あらためて主な機能強化点を以下にまとめる。

1. スクリプトエンジンの改良による実行速度大幅改善
2. データベース標準API PDOの標準サポート
3. タイムゾーンのサポートを含む日付処理の改良
4. 30種類以上の関数追加
5. バンドルされたライブラリ(PCREおよびSQLite)のバージョン更新

 PHP 5.1では,スクリプトエンジンZend Engineが大幅に高速化され,バージョンも2.1.0となった。スクリプトエンジンの高速化により, 反復処理などを含むスクリプトの実行時間が大幅に短縮される。一例として,配列やクラスへのアクセスなどの単純な処理を行うベンチマークテストを実行した際の結果を図1に示す。図では,比較対象をPHP 4およびPHP 5.0のそれぞれ最新版であるPHP 4.4.1,PHP 5.0.5とし,1秒あたりの処理実行回数(数字が大きい方が高速)を表している。

 PHP 5.1.0の実行速度が他のバージョンと比べて著しく速いことが分かる。なお,このベンチマークテストのすべての項目には反復処理が含まれているため,PHP 5.1.0と他のバージョンとの差異が大きくなる傾向がある。実際の実行環境ではデータベースによる処理時間などが支配的となる場合もあり,バージョン間の差異は本稿の結果と異なることに注意されたい。

 PDO (PHP Data Objects)エクステンションは,各種データベースへアクセスするための標準APIを提供している。PHP 5.1では従来のデータベース接続用API(pgsql_*()やmysql_*()など)もサポートされているが,将来的にデータベース接続用APIはPDOに統一される見込みである。

 このPDOは,PHPエクステンションの標準レポジトリPECLにおいても独立したパッケージとして公開されている。PHP 5.1の公開とほぼ同時期(11月26日)にバージョン1.0がリリースされている。PDOは,PHP 5.0.3以降をサポートするが,PHP 5.1での使用が推奨されている。

$GLOBALS変数に関する重大なセキュリティ・ホール:PHP 4.4.1緊急公開

 10月31日,Hardened-PHP Projectは,PHPの現行バージョンにグローバル配列変数$GLOBALSの値を外部から上書きされる重大なセキュリティ上の問題があることを発表した(ITProの関連記事)。

 この不具合はregister_globals=onの設定で実行されているPHP実行環境において,グローバル配列変数($_FILESなど)の初期化にバグがあることにより,グローバル配列変数$GLOBALSの内容を書き換えることができてしまうというものである。結果として,外部から悪意のあるPHPスクリプトを送り込まれて実行されたりといった重大な問題が発生する可能性がある。register_globalsはリクエストパラメータ(POST/GET/Cookie)を自動的にグローバル変数として登録する設定パラメータであり,セキュリティ・ホールを生みやすいためにPHP 4.2.0以降ではデフォルトでoffとなっているパラメータである。しかし,比較的著名なPHPアプリケーションの中にもいまだにregister_globalsをonに設定しないと動作しないものもあるので注意が必要である。

 なお,register_globals=offの設定で実行されている場合でも,不用意にimport_request_variables()関数などによりリクエストパラメータをグローバル変数に取り込む処理を行っている場合には,同様に$GLOBALS変数を書き換えられてしまう可能性がある。

 本件については,大垣氏が詳細な解析結果を以下のblogエントリにまとめているので参照されたい。

http://blog.ohgaki.net/index.php/yohgaki/2005/11/09/phpa_rc_fei_a_oa_oa_fa_sa_le_acsa_oe_afp_2

 このセキュリティ・ホールに関する情報が公開された同じ日(10月31日)に,この問題に対応する修正を行ったPHP 4.4.1が緊急リリースされた。また,PHP 5については,11月24日に公開されたPHP 5.1.0においてこの問題が修正されている。PHP 4およびPHP 5のユーザーは,それぞれの最新版への更新が推奨されている。

 なお,PHP 4.3.11やPHP 5.0.5に関してはこの問題に関する修正パッチが公式には提供されていないが,前述の大垣氏により修正パッチが公開されている。

 なお,PHP 4.4.1ではこの問題以外にも約50件の不具合が修正されている。セーフモード有効時のアクセス権限設定の不備などセキュリティに関連する不具合も含まれているため,PHP 4系のユーザーは早期のバージョン更新が推奨される。

 ただし,PHP 4.4.1においては,mb_send_mail()の第5引数が使用できないという問題やMIMEヘッダーエンコード時に文字化けが発生するという問題が判明している。これらの問題は,既に開発版のソースコードでは修正されており,次期バージョンのPHP 4.4.2においては解消される予定となっている。

 既にPHP 4.4.2RC1のソースコードがPHP 4.4系のリリースマスタであるDerick Rethans氏が管理するディレクトリ(http://downloads.php.net/derick/で11月18日に公開されているので,この問題を抱えるユーザーは試用してみると良いだろう。

 次に,パリでの開発者ミーティングで定められたPHP 6の方向性と,入力チェックを行うエクステンションfilterを紹介する。