PHP 4.1.0 Release Announcement

この和訳は 藤本@アストラザスタジオ 様に頂きました。ありがとう御座います。

ご注意
藤本様に質問のメールなどを出すのはご遠慮ください。
和訳に関する質問やミスや改良案などございます方はwebstaffまでお願いします。
原文はhttp://www.php.net/release_4_1_0.phpになりますのでそちらをご参照下さい。
また、技術的な内容に関しましてはPHP-usersメーリングリストへお願いします。



PHP 4.1.0 Release Announcement

長いQA(Quality Assurance)プロセスを経て、ついにPHP 4.1.0がリリースされました。 http://www.php.net/downloads.php でダウンロードできます。

PHP 4.1.0 に含まれる重要な更新は以下の通りです:
お気づきの人も多いかと思いますが、このバージョンは非常に歴史的なものです。 なぜなら(バージョン番号の)2番目の数字を初めてインクリメントしたからです:) この前例の無い変更には主に2つの理由、すなわち新しい入力インターフェース とバージョニングサポートによってモジュールのバイナリレベルでの互換性が失 われたことによります。

以下の記述は新しい入力方式(ここで言う入力方式とは、フォームから送信され た内容やクッキー、環境変数、セッション変数等にPHPスクリプトからアクセス する方法のことです)に関するものです。PHP 4.1.0での変更点の完全な一覧は changelogを参照下さい。



セキュリティ:新しい入力方式

なによりもまず、貴方がこの先何を読むにせよ、PHP 4.1.0は以前の入力方式を サポートするということを強調しておきます。以前のアプリケーションは 変更することなしに問題なく動作します。

さぁ、古い話はほうっておいて先に進みましょう :)

いくつかの理由によって、register_globalsがonになっている(つまりフォーム、 サーバそして環境変数が自動的にグローバル変数になる)と、色々な意味で危険 があります。例えば、以下のようなちょっとしたコードを考えてみましょう:

<?php
if (authenticate_user()) {
  
$authenticated true;
}
...
?>

このコードは危険です。なぜならリモートユーザが'authenticated'をフォーム 変数として送信するだけで、たとえ authenticate_user() がfalseを返したと しても $authenticated は実際には true となってしまうのです。これは単純 な例ですが、実際にも少なからぬPHPのアプリケーションがこの機能に関連する 問題によって危険なものとなっています。

安全なコードをPHPで書くのは十分に可能ですが、私たちはPHPが危険なコードを あまりに簡単に書けてしまうのは良くないと考えて、大規模な変更を行い、 register_globalsを使用*しない*ように推奨する決心をしました。言うまでも なく、世界中の非常に多くのPHPコードはこの機能の存在を前提としているので PHPから実際に削除してしまう、という考えは現在のところまったくありませんが、 出来る限りこの機能の使用を中止するように推奨していくつもりです。

register_globalsをoffにしてPHPをアプリケーションを書くユーザの助けとなる ように、以前のグローバル変数の代わりとなるようないくつかの新しい特別な 変数を追加しました。新しい特殊な配列は以下の7つです:

さて、これらの変数は特殊な内容を格納していますが、他にも特別なことが あります。それは、どのようなスコープであっても自動的にグローバル変数 として扱われる、ということです。これはつまり、'global'宣言をすることなく どこでもこれらの変数にアクセスできるということです。例えば:

<?php
function example1()
{
    print 
$_GET["name"];   // 動作します。 'global $_GET;' は不要です!
}
?>


といったコードが問題なく動作します。この機能が古いコードを新しいコードに 書き直す際の痛みを和らげてくれることを期待しています。また、この機能は 新規にコードを書くが非常に簡単になるという自信があります。もう一つ、 ちょっとした機能があります。それは$_SESSION変数に新しい内容を追加すると、 その内容を自動的に(つまり、session_register()を呼んだかのように) セッション変数として登録してくれる、ということです。この機能は セッションモジュールに関してのみ適用されます。つまり$_ENVに新しい内容を 追加しても、暗黙のうちにputenv()が実行される、ということはありません。

PHP 4.1.0 はまだデフォルトでregister_globalsをonにしています。これは 過渡期のバージョンなので、私たちはアプリケーションの作者、特に世界中の 人々に使われるようなアプリケーションの作者の方々に、register_globalsが offになっている環境でもそのアプリケーションが動作するように変更することを 推奨します。もちろん、PHP 4.1.0 で提供される新しい機能を使用することで 移行を簡単にすることが出来ます。

PHPの次のsemi-majorバージョンでは、PHPを新規インストールしたときには デフォルトでregister_globalsがoffとなる予定です。しかし心配は不要です。 すでにregister_globalsがonになっているphp.iniファイルがある場合にそれを 変更するようなことはありません。新しいマシンにPHPをインストールした場合 (主として新規の場合)にのみ影響します。もちろん、それをonにすることも できます。

注意:これらの配列のうち、いくつかは古い名前(例えば $HTTP_GET_VARS)を 持っています。これらの名前はまだ使用可能ですが、この短くて自動的に グローバルとなる新しい変数を使用することをお勧めします。

この問題を指摘、分析してくれた Shaun Clowes (shaun@securereality.com.au) に感謝します。