[PHP-users 19115]Re: register_globals = Onはどの程度危険なのでしょう?

Mori Reo list-program @ rucifer.ddo.jp
2003年 11月 26日 (水) 06:30:41 JST


森と申します。

register_globals = on にすることによって
POSTやGETで渡される値がPHPスクリプト中の
変数に直接代入されてしまいます。
これは作成者が予期せぬ値を代入することが可能ということです。

http://example.com/foo.php?var=0
として、このvarの値をregister_globals = onの時に
参照するには$varとして扱いますが、ユーザがこのURLに
?var=0&constant=foo という値を追加したとします。
するとPHPスクリプトの中で、外部からの値の代入は
予期していない変数(この場合は$constant)に勝手に
値が代入されてしまいます。

例えばですが、下記のようなスクリプトがあったとします。

$valid = 0;
if($validPassword === "drowssaP")
    $valid = 1;

if ($valid === 1)
    print "認証が成功した場合に表示する";

この例ではパスワードが正しい場合には$validに1
が代入され、その後のチェックで$validが1の時にだけ表示
するというスクリプトです。しかしregister_globals = onが
設定されていると http://example.com/foo.php?valid=1
とすることによって、認証のロジックを無視し、値を代入
出来るといったことになります。このような動作が極めて
危険ということです。つまり、定義されている変数が予期せぬ
値に勝手に置き換えられている可能性があるということです。

register_globals = off にしたときには$_REQUESTや$_GETおよび
$_POSTといった変数を用いることによって外部からの変数を
扱うことができます。

詳しくはマニュアルの「変数 PHPの外部から来る変数」などをご覧下さい。
http://www.php.net/manual/ja/language.variables.external.php

David A. Wheeler氏の
Secure Programming for Linux and Unix HOWTO 
9.言語固有の問題 9.8.PHP でもこの問題が取り上げられています。
http://www.linux.or.jp/JF/JFdocs/Secure-Programs-HOWTO/php.html

------------
森 怜峰 <reo @ rucifer.ddo.jp>


PHP-users メーリングリストの案内