ホームページ >バックエンド開発 >PHPチュートリアル >PHPのグローバル変数の脆弱性を少しずつ分析

PHPのグローバル変数の脆弱性を少しずつ分析

WBOY
WBOYオリジナル
2016-07-25 08:56:451086ブラウズ
  1. if (isset($_REQUEST['GLOBALS']) OR isset($_FILES['GLOBALS'])) {
  2. exit('リクエスト汚染が試行されました。');
  3. }
コードをコピー

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:

  1. function goddslashes($string, $force = 0) {
  2. !define('MAGIC_QUOTES_GPC') &&define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc());
  3. if(!MAGIC_QUOTES_GPC || $force) {
  4. if(is_array($string)) {
  5. foreach($string as $key => $val) {
  6. $string[$key] = kiddslashes($val, $force);
  7. }
  8. } else {
  9. $string = addlashes($string);
  10. }
  11. }
  12. return $string;
  13. }

include/common.inc.php のコードをコピーします。

  1. foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
  2. foreach($$_request as $_key => $_value) {
  3. $_key{0} ! = '_' && $$_key = godslashes($_value);
  4. }
  5. }
コードをコピーします

register_globals=on のときに GLOBALS 変数を送信することで、上記のコードをバイパスできます。

Discuz! で提供される予防方法:

  1. if (isset($_REQUEST['GLOBALS']) OR isset($_FILES['GLOBALS'])) {
  2. exit('リクエスト汚染が試行されました。');
  3. }
コードをコピー

$_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 のグローバル変数の抜け穴と一時的な解決策を紹介するもので、皆様のお役に立てば幸いです。



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。