register_globals は PHP の制御オプションで、オフまたはオンに設定できます。デフォルトはオフで、EGPCS (環境、GET、POST、Cookie、サーバー) 変数をグローバル変数として登録するかどうかを決定します。 register_globals がオンになっている場合、クライアントによって送信されたデータには GLOBALS 変数名が含まれており、サーバー上の $GLOBALS 変数が上書きされます。 したがって、このコードは、送信されたデータに GLOBALS 変数名が含まれている場合、プログラムは終了されるという判断です。 これによるセキュリティ上の問題は、PHPの「自動グローバル変数の脆弱性」となりますので、register_globalsオプションを必ずオフにしてください。また、$_REQUEST の代わりに $_GET、$_POST、$_COOKIE を使用してください。 フォーラムはグローバル変数防御の脆弱性を回避します php5.3.x バージョンの php.ini 設定の request_order のデフォルト値は GP であるため、Discuz 6.x/7.x ではグローバル変数防御をバイパスできます。 include/global.func.php:
include/common.inc.php のコードをコピーします。
register_globals=on のときに GLOBALS 変数を送信することで、上記のコードをバイパスできます。 Discuz! で提供される予防方法:
$_REQUEST スーパーグローバル変数の値は、php.ini の request_order の影響を受けます。最新の php5.3 では、request_order のデフォルト値は GP です。つまり、デフォルト設定では、$_REQUEST には $_GET と $_GET のみが含まれます。 $_POST ですが、 $_COOKIE ではありません。 GLOBALS 変数は、COOKIE を使用して送信できます。 一時的な解決策: php 5.3.x の php.ini 設定を変更し、request_order を GPC に設定します。 これは、PHP のグローバル変数の抜け穴と一時的な解決策を紹介するもので、皆様のお役に立てば幸いです。 |