PHP4からPHP5への移行について

PHP4のサポート終了がアナウンスされことに伴い、技術評論社の方からPHP4からPHP5への移行の記事を書く事になりました。毎週新しい記事が公開されます。下記のURLが最初の記事で8/2(予定)から順次続きが公開されます。

http://gihyo.jp/dev/feature/01/php-migration/0001?page=1

記事を書いてみて思ったのですが、自分にとってはPHP4とPHP5両方で動作するコードを書くのはそう難しくないのですが時々PHPでコードを書いている方、PHPの開発状態を把握していない方には結構難しいのではないかと思いました。今回の記事は「移行」にのみ焦点をあててPHP5の新機能はほとんど紹介しませんでしたがかなりボリュームになってしまいました。それでも十分とは言えないです。PHP5への移行をお考えのかたは8/2から上記URLを参考にして頂ければ幸いです。

ところで、隔週(の予定…で実際は月一回くらい…)でセキュリティ関係の記事も http://gihyo.jp/ にて連載しています。こちらもよろしくお願いします。

http://gihyo.jp/serial/2007/php-security

どの記事でもコメントなどございましたらメールで頂けると助かります。

Sonyも仮想世界に参入

SecondLifeとか話題になっているのにSonyがPS3で参入しない手はない、と思っていたらPLAYSTATIOIN@Homeというサービスを予定しているのですね。ニュースになっていたのでしょうが知りませんでした。基本無料、一部有料というスタイルらしいです。タイトルをクリックすると紹介ムービーが見れます。PS3らしくかなり凝った3Dです。仮想世界は結構いろいろなところが参入/参入表明していますがハードを持っているSonyはなんだかんだいって強いかと思います。

アメリカで一番利用されているゲーム機はPS2とのニュースがありましが、システムソフトウェアのバージョンアップでPS2ゲームもフルスペックハイビジョン化(アップコンバート)できたり、さらに普通のDVDもフルスペックハイビジョン化、最新のシステムソフトウェアではCDを2倍、4倍でアップコンバートしたり、Cellの利点を生かした機能はいろいろ便利そうです。PS3ももう少しうれても良さそうなんですけどね。ハイビジョン対応のテレビの普及率の問題もあるのかな?

ドルビー(だったかな?もしかするとBOSEだったかも)がどんなソースでも5.1ch化する物を発表していましたが、何でも5.1ch化もあったら良いですね。(もしかしてもうある?)
# このニュースを見たときモノラルでも5.1ch化できるの?と疑問に
# 思ったのですがニュースには詳細は書いてありませんでした。

PS3は欲しいハードの一つなので年末商戦値下げで買っても良いくらいの値段になると良いですね。
# ゲームを全くしないので無駄遣いですが

カラーレザープリンタの印刷物に埋め込まれたコード

コピーすると「COPY」と印刷されてしまう機能は有名です。
コピー機、PhotoShopの紙幣複製を防止する機能も知っていましたが

カラーレーザープリンターで印刷されたものには全てこのように肉眼では判別し難い黄色いピクセルをバーコード(大きさは8×15ピクセル)のように印字することによって、プリンターのメーカー名、機種名、シリアル番号、印刷された日時の4つの情報を合計15バイトの情報としてコード化して埋め込まれているという。

プリンタ、コピー機業界では常識なのかもしれませんが知りませんでした。
# どこかで聞いたことがあるような気もしますが覚えてませんでした。

このバーコード、日本国内で販売されているカラーレーザープリンターでも印刷物にブラックライト(紫外線ランプ)を当てて丹念に調べれば肉眼で確認することができるという。

ブラックライトを持っていないので確認できません…

この機能、全うな目的で印刷する人には何の問題もありませんが不正な目的で印刷しようとする人を思いとどまらせる為に役立つかも知れません。印刷ログを残しておけば時間とプリンタでユーザまで特定できます。すべてのプリンタ、コピー機に入れても良いと思いますがどうでしょう?似たようなセキュリティソリューションを購入する必要もなくなります。

この機能、やはりカラープリンタそれもカラーレーザープリンタ向きの機能だと思うので、問題は全てのプリンタをカラーレーザープリンタにするのは導入とランニングコストがかかり過ぎることくらいでしょうか?

白黒コピー機でコピーしてもこのコードは読めるのかどうか気になります。多分読めないとは思いますが。

BIND9のDNSキャッシュ汚染

BIND9にDNSキャッシュ汚染の脆弱性だそうです。

The paper shows that BIND 9 DNS queries are predictable – i.e. that the source UDP port and DNS transaction ID can be effectively predicted. A predictability algorithm is described that, in optimal conditions, provides very few guesses for the “next” query (10 in the basic attack, and 1 in the advanced attack), thereby overcoming whatever protection offered by the transaction ID mechanism. This enables a much more effective DNS cache poisoning than the currently known attacks against BIND 9. The net effect is that pharming attacks are feasible against BIND 9 caching DNS servers, without the need to directly attack neither DNS servers nor clients (PCs). The results are applicable to all BIND 9 releases [1], when BIND (the named daemon) is in caching DNS server configuration.

まだ中身を見れていないのですが、最適な条件であれば基本的な攻撃で10回、高度な攻撃で1回で次のトランザクションIDを推測できる、としています。最適な条件がどれくらいあるのか?は読んでみないとわからないです。

All stable versions of BIND 9 to date (except the ones released simultaneously with this paper) are vulnerable, i.e. BIND 9 versions 9.4.0-9.4.1, 9.3.0-9.3.4, 9.2.0-9.2.8, 9.1.0-9.1.3 and 9.0.0-9.0.1.

とあるので、BIND9の最新版では問題は修正されているそうです。 http://www.isc.org/index.pl を見ると確かに今月リリースの9.xが紹介されています。

CVEはこれ
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2007-2926

BIND8, BIND4には影響がないとされています。

Flashをブロックして意外と使えると思った副作用

数日前のエントリで書いた通りFlashコンテンツが自動的に再生されるリスクを回避するために、明示的に指示しないとFlashコンテンツが再生されないFirefoxアドオンを利用しています。

Flashblock
https://addons.mozilla.org/ja/firefox/addon/433

私はサイト上の広告はほとんど気にしない方なので広告をブロックするような拡張は使っていませんが、Flashをブロックすると動きがある広告が表示されなくなりページが読みやすくなりました。気にはしていなかったのですが文章を読んでいる最中にすぐ横でアニメーション広告があると非常に邪魔です。

私の使い方では作者コメントに書いてあるようにクラッシュが頻繁に発生することも無いようです。セキュリティが気になる方には当然お勧めのアドオンですが、アニメーション広告が邪魔で仕方ない方にもお勧めだと思います。
# アニメーションGIFの広告もあるのでこちらは別途ブロックしないと
# ブロックできません。念のため。

globで任意コード実行の脆弱性

FirstにPHPのglobで任意コード実行の脆弱性、とあったのでCVSを見てみるとglob用のメモリ構造体を未初期化で使用しているコードが修正されていました。未初期化の構造体メモリを任意データで書き換える必要があるので、攻撃を行うには攻撃が可能となるメモリレイアウトを作る比較的特殊なコードが必要になると思われます。

任意コード実行の脆弱性として

Remotely Exploitable : Yes
Locally Exploitable : Yes

の割には

Rated as : Moderate Risk

となっています。これは攻撃可能なメモリレイアウト作成はあまり直感的ではないから、もしくはPoCレベルの通常では起こりえない状況用の攻撃コードのみ作成されているからだと思われます。

これはPHP5.2.3以下の脆弱性です。以下はHEADのパッチです。
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/dir.c?r1=1.166&r2=1.167
見ての通り、1 linerパッチです。

PHP4のサポートが終了しますが「ディストリビュータのサポートは別途で長いから」とディストリビュータのサポートに期待している方も多いと思います。ディストリビュータがどの程度セキュリティパッチをサポートしてくれるのかちょうどよいベンチマークになると思います。

Flashもブロック対象の時期か…

Flash Player関連のセキュリティ問題は結構レポートされています。最近見つかった脆弱性もかなり危険です。デフォルトでFlashを実行するのはリスクが高いですがFlashがないとまともにナビゲーションできないサイトも多いのでインストールしない訳にもいきません。

Firefoxの場合ならFlashblockアドオンでFlashをブロックし、選択してから実行できるようになります。

Flashblock
https://addons.mozilla.org/ja/firefox/addon/433

Firefox coreのバグで頻繁にクラッシュする、とコメントにありますがとりあえず入れてみました。Firefoxでインストールする必須セキュリティ関係アドオンリストに加えるべきか試してみたいと思います。

他のセキュリティ関係アドオンでお勧め

NoScript- JavaScriptを実行しない
https://addons.mozilla.org/ja/firefox/addon/722

HttpOnly – IEの「JavaScriptにクッキーを読ませない機能」をFirefoxに追加
https://addons.mozilla.org/ja/firefox/addon/3629

この2つは安定していると思います。すべてのユーザにお勧めです。HttpOnlyはすべてのサイトでJavaScriptからクッキーが読めなくなるアドオンではありません。WebアプリがMS独自拡張のhttponly属性を追加してクッキーを設定した場合にのみJavaScriptからクッキーが読み出せなくなります。PHP5のsetcookie/setrawcookieにはhttponly属性を送信するオプションが追加されています。

PHPでQtアプリ

PHPでGTKアプリが作れるPHP-GTKは以前からありましたが、PHPでQtアプリが作れるPHP-Qt 0.1がリリースされています。

The PHP-Qt team is pleased to announce the immediate release of PHP-Qt Version 0.1!
It’s been nearly a year since the release of version 0.0.3 and many, many things have changed, including the move to using the Smoke library.
A few of the changes from 0.0.3 to 0.1 are:

* Unit tests based on phpunit
* Overriding of Qt methods in PHP classes
* Improved startup time
* Improved runtime speed
* improved inheritance
* CMake-based build system
* Support for references
* There is now a global tr() function
* Based on the Smoke library
* License: GPL (see note below)

$intval * 1でサニタイズ…

たまたま見たPHPのコードでSQL文中の整数値を

$intval * 1

として整数型にするサニタイズがありました。この方法をお薦めするわけではありませんが、以前のエントリ

http://blog.ohgaki.net/index.php/yohgaki/2007/07/04/example_1428_a_best_practice_query

でsprintf()の%dを使う方法よりはましです。

$ php -r “echo ‘99999999999999’ * 1;”
99999999999999

実行したマシンは32bitのLinuxシステムですが浮動小数点型に自動変換されるので2^31を越える値でも正しく表示されます。一方、PHPマニュアルの方法だと

$ php -r “printf(‘%d’, ‘99999999999999’ * 1);”
276447231

となってしまいます。最近のDBは大きなモノも珍しくないのでこの程度でオーバーフローするようでは安心できません。もっとも*1方式でもあと一桁増やすと

$ php -r “echo ‘999999999999999’ * 1;”9′ * 1);”
1E+15

と指数表記になるのでこれで十分とは言えません。しかし、マニュアルのベストプラクティスよりは良いです。printf系で処理するなら

$ php -r “printf(‘%1.0f’, ‘99999999999999’ * 1);”
99999999999999

これで十分なDBも多いとは思いますが、ダイナミックにSQL文を生成するのであれば文字列として渡してエスケープしてしまうと確実です。

VaioのHDD壊れる…

Windowsのメインマシンとして利用していたVaio Z1ですがHDDが壊れました…時間がないのでここ数日はZero3のメール(仕事のメールだけ)しか見てません。# メールを送っている方、済みません

なんとなくHDDへのアクセスの感じが変わったので、もしかして、と思い次のノートPCはMacBookに決めていたので新しくMacBookは買っていたのですがバックアップはプロファイルディレクトリだけだったので、最近の書いたサンプルコードが消えてなくなりました。結構がんばって書いたのに… subversionリポジトリ作成を後回しにしていた付けです。同じコードを書き直すのは疲れるんですよね…

壊れたのは数日前でやっとましな環境になった、と思ったらOSXとVistaの両方が使えるようにParallels DesktopをインストールしていたのですがParallelsを起動しているにも関わらず何故かWindowsのボリュームは共有ではなくボリュームとして見えていたので開いてみるとNTFSがボロボロに壊れてしまいました。ボリュームはリードオンリーなのかな?と思っていたらリードライトだったのですね… もしParallels Desktopが起動しているときにWindowsのボリュームが見えても決して開いてはいけないようです。(普通は隠れる)

文面から分かると思いますがまだあまりParallels Desktopは使っていませんが結構便利にできているのでXP/Vistaのライセンスが余っている人にはお薦めだと思います。試用版があるのでためし易いです。(私もまだ試用版)ただし、何もしてなくても50%CPU時間を消費(Vista Business)ので軽くはないです。いざと言うときはにbootcampで起動すれば良いので困らないと思います。

ところでParallels DesktopはbootcampにインストールしたWindowsを起動できるので既にWindowsをbootcampでインストールしている人なら追加ライセンスは要らないようです。(間違っていたら教えてください)共有を利用してWindowsからOSX、OSXからWindowsのファイルが扱えるようになっているのは便利です。直接OSXのファイルをWindowsアプリで開くことができるなどかなり便利です。

追記:プロファイルのデータをコピーしはじめたら1日以上かかるって….

PHP4のサポート終了は2008/8/8

現状でもセキュリティフィックスの状態があまり良いとはいえないのでPHP5が利用できる場合は積極的にPHP5を利用すべきですが、2007/12/31まで通常メンテナンス、以後2008/8/8までセキュリティフィックスには対応ということです。

まだの方は早くPHP5に移行しましょう。

間違っても5.1系に移行しないようにしましょう… 5.1系は今現在もメンテナンスされていません… 5.2系のみメンテナンスされています。

Example 1428. A “Best Practice” query

PHPのマニュアルページで「Example 1428. A “Best Practice” query」と題されたSQL文用の文字列エスケープ処理のサンプルコードがあるのですが、

$query = sprintf("INSERT INTO products (name, description, user_id) VALUES ('%s', '%s', %d)",
mysql_real_escape_string($product_name, $link),
mysql_real_escape_string($product_description, $link),
$_POST['user_id']);

mysql_query($query, $link);

この方法はよくないですね… $_POST[‘user_id’]は符号付き32ビット整数だと仮定していて64ビット整数や任意精度整数の場合が考慮されていません。”Best Practice”とするなら整数型と思われるuser_idも文字列として処理し、エスケープしてからmysql_queryに渡すべきだと思います。

GDにセキュリティホール

GDの開発は終わっている、と思っていたらphp.netでホストしてたんですね。PHPの独自拡張など色々追加されていたので自然な流れとは思います。

CVE-2007-3472、CVE-2007-3473、CVE-2007-3474、CVE-2007-3475、CVE-2007-3476、CVE-2007-347、CVE-2007-3478

とGDライブラリの脆弱性がレポートされています。

整数オーバーフロー等はずっと以前に指摘され、ずいぶん長い間ディストリビュータがパッチで対応していた問題と同一のような気がしますが、どうなんでしょ?