PHP 4.4.2公開

 1月13日にPHP 4の最新版 PHP 4.4.2が公開された。このバージョンでは,PHP 5.1.2で解消されたHTTPレスポンス分割攻撃に対する脆弱性と,エラー出力機能におけるクロスサイトスクリプティングの脆弱性に関する修正が行われている。

 また,その他,前バージョンであるPHP 4.4.1以降に見つかった約30件の問題が修正されている。前回のPHPウォッチでもふれたがmbstringエクステンションにおける不具合も数カ所修正されている。以下にその内容を紹介する。

1.PHP 4.4.1においてmb_send_mail()の第5引数が使用できないという問題
2.MIMEヘッダーエンコード時に文字化けが発生するという問題
3.mb_encode_mimeheader()で1行の最大文字制限に関するRFC違反となる問題
4. mb_send_mail()のヘッダーで改行コードに関するサニタイズが行われていない問題

 3番目の問題は,mb_encode_mimeheader()でフィールドデータを処理してMIMEヘッダーを生成した場合,フィールド名の文字数は考慮されないので,1行の最大文字数が74文字以下というRFCに違反する場合があるというものである。この問題に対処するため,mb_encode_mimeheader()の第5引数においてインデント文字数を指定できるようにし,フィールド名の文字数を指定できるよう変更が行われた。具体的な使用例として,件名の部分のヘッダーを生成する例を以下に示す。

echo mb_encode_mimeheader($msg,'ISO-2022-JP','B','\r\n',strlen("Subject: ");
?>


 この例では,フィールド名「Subject:」の分の文字数をインデントしてから折り返し処理を行うため,長い件名を指定した場合でも1行の文字数が74文字を越える問題は解消される。

 4番目の問題に関して,ヘッダーにおいて改行文字のサニタイズが行われていない場合,悪意のあるユーザーが指定したあて先にメールを送信され,スパムメールの踏み台にされる可能性がある。この問題は,本来プログラマが適切にサニタイズを行うことで回避できる問題であるが,今回のバージョンでは,mb_send_mail()のヘッダーにおいて改行コードに関するサニタイズ処理を追加し,より安全性を向上させている。

 本バージョンにおいてもPHP5系と同様セキュリティ上の問題が修正されていることから,PHP4系のユーザーに関して早期のバージョン更新が推奨されている。

PEAR/PECL関連情報

 1カ月以内にリリースされたPECLエクステンションの中から有用と思われるものをいくつか紹介する。

memcache 2.0.0

 分散オブジェクトキャッシュシステムmemcachedの機能をPHPから利用するためのPECLエクステンション。SQL結果のキャッシュなどアプリケーションレベルのキャッシュ機構として使用することで,アプリケーションの負荷を低減することができる。memcache自体は汎用のライブラリであり,多くのスクリプト言語によりサポートされている。memcacheは,Slashdotなどの比較的負荷が高いサーバーで稼働した実績を有している。今回リリースされたバージョン2.0.0では,複数のサーバーによるロードバランシングやフェールオーバーのサポートなどが追加され,機能が強化されている。

gdchart 0.2.0β

 gdchartエクステンションは,イメージ描画ライブラリGDの機能を用いてグラフイメージを作成するためのライブラリgdchartの機能をPHPから使用するためのエクステンションである。このエクステンションはまだβ版ではあるが,グラフを描くプログラムとしての完成度は比較的高い。バージョン0.2.0では,PHP 5.1対応などの機能強化が行われている。

 gdchartはPECLパッケージマネージャによりインストールすることができる。

# pecl install gdchart-beta


 設定ファイルphp.iniに以下のように指定することでgdchartエクステンションを読み込むことができる。

extension=gdchart.so


 リスト2に円グラフを作成するスクリプトの例を示す。このスクリプトを実行すると,図1に示すpngファイルが生成される。gdchartでは棒グラフや折れ線グラフなども表示可能であり,多くのオプションがサポートされている。詳細は,上記のgdchartのサイトを参照していただきたい。

 現時点でのバージョンではまだβ版ということであり,3次元グラフと2次元グラフの指定がさかさまになっているなどの問題があるが,グラフを高速に作成できるエクステンションとして今後広く使用されるようになると思われる。

リスト2●gdchartにより円グラフを作成するサンプル

$gdc = new GDChart(GDChart::PIE_2D); // PIE_3Dではないのは恐らくバグ
$gdc->title = "Sample Graph";
// データと値の設定
$gdc->setLabels(array('PHP3','PHP4.2','PHP4.3','PHP4.4','PHP5','other'));
$gdc->addValues(array(10,8,20,22,10,5));
$gdc->setExplode(array(0,0,0,10,0,0));

$gdc->pieDepth = 10;
$gdc->percentLabels = GDChart::LABEL_BELOW;
$gdc->out(300,250,GDChart::PNG, "./3dpie.png");
?>

おわりに

 今回は,PHPの開発状況とgdchartエクステンションなどについて紹介した。次回以降もPHPに関する最新の情報をお届けする予定である。

【追記】JPSpan 0.4.xにおけるエラー処理の問題について

 JPSpanではカスタムエラーハンドラJPSpan_ErrorHandler()によりエラー処理を行っているが、このハンドラにはerror_reportingによるエラー設定によらずE_NOTICEを含むエラー/警告で処理が終了してしまうという問題がある。このため、PHP 4.1、PHP 5.1以降で追加された関数引数の参照渡し通知(E_NOTICE)などで処理が停止してしまう。

 この問題の内容と対策については、以下のURLに記述されている。

[ 1243220 ] Custom error handler and supressed errors
http://sourceforge.net/tracker/index.php?func=detail&aid=1243220&group_id=121636&atid=690938

 具体的な対策として、error_reportingによるエラー設定で出力が抑制されたエラーで処理が停止しないようにするために、JPSpan/ErrorHandler.phpに以下のパッチを適用する。


*** JPSpan/ErrorHandler.php.orig	2006-02-11 10:24:44.000000000 +0900
--- JPSpan/ErrorHandler.php	2006-02-11 10:25:39.000000000 +0900
***************
*** 51,56 ****
--- 51,57 ----
  * @see http://www.webkreator.com/php/configuration/handling-fatal-and-parse-errors.html
  */
  function JPSpan_ErrorHandler($level, $message, $file, $line) {
+     if(error_reporting() == 0) return; 
      $name = 'Server_Error';
      $message = strip_tags($message);
      $message = wordwrap($message, 60, '\n', 1);
 このパッチを適用後、設定ファイルphp.iniで以下のように設定するとE_NOTICEにより処理が停止する事象を回避することができる。

error_reporting = E_ALL & ~E_NOTICE
 また、error_reporting()関数によりスクリプト毎にエラー処理の定義を行うことも可能である。(2006年2月11日追記)

■著者紹介 廣川類(ひろかわ・るい)氏
 PHPがまだPHP/FIと呼ばれていた1996年にPHPに出会い,以降,ドキュメント翻訳や国際化にかかわっている。著書に『PHP4徹底攻略』(ソフトバンクパブリッシング),『PHP4徹底攻略実戦編』(ソフトバンクパブリッシング)などがある。日本PHPユーザー会(2000年4月設立)ドキュメント部門幹事。

この先は会員の登録が必要です。今なら有料会員(月額プラン)は12月末まで無料!

日経 xTECHには有料記事(有料会員向けまたは定期購読者向け)、無料記事(登録会員向け)、フリー記事(誰でも閲覧可能)があります。有料記事でも、登録会員向け配信期間は登録会員への登録が必要な場合があります。有料会員と登録会員に関するFAQはこちら