13

私は、使用するのが標準的だったときに書き戻されたレガシー PHP コードをいくつか継承しましたregister_globals(PHP 4.2.0 の時点で、このディレクティブはデフォルトでオフになり、2002 年 4 月 22 日にリリースされました)。

これを有効にするとセキュリティ上良くないことがわかりました。$_GET問題は、またはを使用する必要があるコード内のすべての場所をどのように見つけるか$_POSTです。私の唯一の考えは、初期化されていない変数について警告するようにエラー報告を設定し、サイトの各部分をテストすることでした。もっと簡単な方法はありますか?サイト内の各コード パスをテストする必要がありますか、それとも PHP はファイル単位で警告を出しますか?

4

4 に答える 4

6

エラーレポートをE_ALLに設定すると、ファイル名と行番号を含む未定義の変数についてエラーログに警告されます(ファイルにログを記録していると想定)。ただし、未定義の変数に遭遇した場合にのみ警告が表示されるため、各コードパスをテストする必要があると思います。コマンドラインからphpを実行することも役に立たないようです。

xdebugという名前のデバッグツールがありますが、試したことはありませんが、それは役立つかもしれません。

于 2008-08-09T08:11:55.487 に答える
3

組み込みのTokenizer関数を使用してスクリプトを作成しました。かなりラフですが、私が取り組んでいたコードベースでは機能しました。CodeSnifferも使用できると思います。

于 2008-08-11T01:08:56.370 に答える
2

レジスタグローバル効果を手動で「偽造」することもできますが、セキュリティを追加することもできます。(私はこれをxoopsと呼ばれるosCommerceフォークから部分的に取得しました)

//  Detect bad global variables
$bad_global_list = array('GLOBALS', '_SESSION', 'HTTP_SESSION_VARS', '_GET', 'HTTP_GET_VARS', '_POST', 'HTTP_POST_VARS', '_COOKIE', 'HTTP_COOKIE_VARS', '_REQUEST', '_SERVER', 'HTTP_SERVER_VARS', '_ENV', 'HTTP_ENV_VARS', '_FILES', 'HTTP_POST_FILES');
foreach ($bad_global_list as $bad_global ) {
    if ( isset( $_REQUEST[$bad_global] ) ) {
        die('Bad Global');
    }
}

//  Make global variables
foreach ($_REQUEST as $name -> $value) {
    $$name = $value; // Creates a varable nammed $name equal to $value.
}

コードをより安全にするために微調整したいのですが、少なくともグローバル構成変数(パスやベースURLなど)を不良グローバルリストに追加することによって。

また、これを使用して、使用されているすべてのget / post変数のリストを簡単にコンパイルして、たとえば$return_urlのすべての出現箇所を$_REQUEST['return_url]に置き換えることができます。

于 2008-08-17T17:36:54.673 に答える
0

特定のコマンドを使用してそのスクリプトのphp.ini値を設定する方法があることを知っているので、これも調べてみました-ページの最後の投稿に移動

また、役立つ可能性のある次の投稿を見つけました-ページの最後の投稿に移動します

誰も答えを見つけられなかったら、これにさらに追加しますが、今は電車に乗らなければなりません。

于 2008-08-09T07:01:06.503 に答える