3

私は何年も前に構築されたアプリケーションに取り組んでいますが、最近正しく動作しなくなりました。昔のプログラマーは、から変数を読み取らずに$_GETまたは変数にアクセスしている可能性があると言いましたが、$_POST$_GET[] arrayregister_globals

質問したいのは、配列$_GETを使用せずに変数にアクセスするさまざまな方法$_GET[](直接的な方法など) と、既知の場合、このアプリケーションがそれらのいずれかを使用しているかどうかを確認するにはどうすればよいかということです。

前もって感謝します

編集:私が覚えていた他の方法はregister_globals、ではなく、でしmagic_quotesた。また、私はそれを使用したくありませんが、それが使用され、最新のサーバー更新で廃止されたかどうかを検出します (アプリが正しく動作しなくなった理由を説明できるもの)

編集:今日の私の英語はひどいです。回答の1つで説明したように、元のプログラマーがクエリ文字列からPHPに変数を取得するためのあいまいなおよび/または非推奨の方法を使用したかどうかを確認する必要があるため、アプリケーションが現在使用している値が間違っている/初期化されていません

重要な編集import_request_variablesテーブルから外れており、使用されていません。すべての$_配列もテーブルから外れています。これは、最新の更新でそれらが壊れていないためです (=>それらはまだ機能しています)。どの変数が で初期化されているかを検出するにはどうすればよいregister_globalsですか?

まだ別の編集:私はこれを見つけました:

foreach ($_POST as $k => $v) {
  eval("\$".$k." = '".$v."';");
}
foreach ($_GET as $k => $v) {
  eval("\$".$k." = '".$v."';");
}

最新の更新 (最大で 1 週間前)のいずれかによって壊れた可能性がありますか?

4

5 に答える 5

4

マジック クォートではなく、 Register Globalsを意味します... ところで、Register Globals は純粋な悪であり、決して使用しないでください (PHP 5.3.0 では廃止されています)。

編集:アプリケーションがRegister Globalsを使用したかどうかを確認したい場合は、$_GET値を変数として検索してみてください。たとえば、PHP コードでindex.php?id=123検索してみてください。$idこれが見つかった場合、これはスクリプトが Register Globals を使用していることを意味するわけではありません$idが、どこからともなく発生し、初期化/設定されていない場合は、アプリが Register Globals を使用しているという良い (悪い!) 兆候です...

于 2010-11-11T14:09:03.590 に答える
2

また、$_REQUESTmagic_quotes (非推奨) は変数の内容にのみ影響し、それらをキャプチャする手段には影響しません。

import_request_variablesも参照してください。元のコーダーはこれを使用して GET 変数の内容を取得し、それを別の変数に挿入してから参照している可能性があります。

于 2010-11-11T14:07:18.157 に答える
2

$_SERVER["QUERY_STRING"]生のGET文字列が得られます。

そうは言っても、これは別の変数を使用するのではなく、根本的に修正する必要がある問題のように思えます。

マジック クォートが問題になる場合は、それらが有効になっているかどうかを確認し、それに応じて受信データを処理します。

PHP マニュアルのDisabling Magic Quotesページには、機能がアクティブ化されているかどうかに応じて受信データを「修正」する方法が示されています。膨大な量のデータにはあまり効率的ではありませんが、日常のタスクでは実行する必要があります。

于 2010-11-11T14:08:40.720 に答える
1

Register Globalsは、古いPHPプログラムがしばしば依存する恐ろしい機能です。

レジスタグローバルがオンになっていると、PHPはGET変数とPOST変数を調べ、それらを通常の変数名に「プロモート」します。たとえば$_GET['myvar']、コードで。としてアクセスできます$myvar

他の問題の中でも、これにより、プログラマーが使用した可能性のある他の変数名を推測するだけで、ハッカーがプログラムを簡単に破ることができます。したがって、グローバル登録機能はデフォルトで長い間オフにされており、現在は正式に非推奨になっており、将来のバージョンでは完全に削除される予定です。

この方法で使用される変数は、通常の変数と区別がつかない方法で参照されるため、レジスタグローバルを使用する古いコードを更新しようとするのは非常に難しい場合があります。それは、コードがどれだけうまく書かれているかに大きく依存します。

于 2010-11-11T14:25:36.657 に答える
1

問題はおそらくPHP のregister_globals. このオプションにより$_GET['some_var']、または同等の$_POSTバージョンが$some_var自動的に利用可能になります。これは非推奨であり、絶対に使用すべきではありませんが、他のプログラマーがそのアプリケーションでそれらを使用した可能性があります。

于 2010-11-11T14:11:27.283 に答える