今回は,昨年末にサポートが終了したPHP 4のアップデートリリースとしては最終バージョンとなるPHP 4.4.8の紹介と,加えて残り7カ月弱と迫ったPHP 4のセキュリティサポート終了を迎えるにあたっての対策と注意事項を紹介する。

PHPリリース関連情報

 2008年1月3日,PHP4.4.8の正式版がリリースされた。

 このリリースは,PHP 4.x系の主要な機能追加としては最後のリリースとなった。今後,重要なセキュリティ問題への対応が必要な場合に限り,2008年8月8日まではサポートが行われることになるが,一般的な機能追加や修正は行われなくなる。

 事実上,PHP 4の開発は昨年末をもって終了することとなり,これから8月までの期間はユーザに対してPHP 5への移行を促すための準備期間と言えるだろう。

PHP 4.x系リリースの最終バージョン PHP 4.4.8

 今回リリースされた PHP 4.4.8の特に重要な変更点として,昨年初頭に発表されたMonth Of PHP Bugs で公表された重大な2つのバグMOPB-02-2007 と MOPB-03-2007への対応が挙げられる。

 MOPB-02-2007は,関数の再帰呼び出しにより生じる問題で,PHPでは関数の再帰呼び出しの上限が設定されていないため,極めて深い関数の再帰呼び出しを行った場合にスタックメモリを使い切ってしまうことでスタックオーバーフローを起こしPHPがクラッシュしてしまう。

 MOPB-03-2007も同様に再帰呼び出しに関するスタックオーバーフロー問題だが,こちらは非常にネストの深い配列をパースした場合,そのメモリを解放する際に生じる問題である。

 これらはいずれも,ディープな再帰呼び出しへの対応が行われていなかったことにより引き起こされていたバグである。 特にMOPB-03-2007の問題に対応するため,PHP 4.4.8では新たに'max_input_nesting_level'というphp.ini設定が追加されるようになった。

 このmax_input_nesting_levelという設定は,その名の通り外部入力の値を展開する際の最大ネストレベルを定義する設定だが,この値がPHP 4.4.8ではデフォルトが500に設定されている。

 それに対し,同じく対応が施されたPHP5.2.2以降ではデフォルト値が64となっているので,移行の際にはこういった設定も注意しておく必要がある。

 より安全なポリシーでの運営を心掛けるのであれば,PHP 4.x系をPHP 4.4.8にアップグレードする際には,max_input_nesting_levelの値を最低限PHP 5.2.x系に合わせ64に設定するなどの処置を行っておいた方がよいだろう。

 また,その他にPHP 4.4.8では以下に示すセキュリティ上の問題が修正されている。

・chunk_split()関数におけるオーバーフローを修正
・str[c]span()内のオーバーフローを修正
・glob()関数において,再帰的なディレクトリ指定を行った際にopen_basedirの指定が正しく動作しない問題を修正
・money_format()関数が複数の%iや%nトークンを受け付けない問題を修正
・open_basedirやsafe_modeが有効な場合に,MySQLのINFILE LOCALオプションをハンドリングしてしまう問題を修正
・session.save_pathとerror_logの値がopen_basedirとsafe_modeの値を参照しない問題を修正