2008-08-09 14 views
10

register_globalsを使用するのが標準的な方法で書かれたものを継承しました(PHP 4.2.0以降、このディレクティブのデフォルトはoff、2002年4月22日にリリースされています)。register_globalsのコードを無効にする

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

答えて

5

エラー報告をE_ALLに設定すると、エラーログに、ファイル名と行番号(ファイルにロギングしていることを前提としています)を含む未定義変数が警告されます。ただし、未定義の変数を参照する場合にのみ警告を表示するので、各コードパスをテストする必要があります。コマンドラインからphpを実行しても、助けにならないようです。

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

0

私は特定のコマンドを使用して、そのスクリプトのphp.iniの値を設定する方法があることを知って、私はこのように見て行き、あまりにもこれを見つけた - Goto last post on page

私はまた、使用のものであってもよい以下の記事を見つけました - Goto last post on the page

答えを見つけた人がいない場合は、これ以上追加しますが、今は電車に乗る必要があります。

3

Tokenizer機能を使用してscriptを書きました。そのかなり粗いが、私が取り組んでいたコードベースのために働いた。 CodeSnifferも使用できると思います。

2

レジスタのグローバル効果を手動で '偽造'できますが、セキュリティを追加できます。 (私は一部osCommerceのフォークからこれをつかん呼ばXOOPS)

// 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]に置き換えるのに役立ちます。

関連する問題