0

GETリクエストを介して他のファイルを含むページにこのコードがあります:

$page = strtolower($_GET['page']);

if(!$page or !$allow[$page] or $page == 'home') {
    header("Location: home.php");
}

ここ$allowで、含まれる有効なファイルである許可された文字列のリストを含むハードコードされた配列です。コードインジェクションを許可する明らかな何かが欠けているのでしょうか、それともこのチェックで十分でしょうか?

4

5 に答える 5

3

register_globalsが $allow の上書きを許可しない限り、脆弱ではありません。

ただし、通知はスローされますが、個人的には大文字と小文字を区別しないので、次のようにします。

if (empty($_GET['page']) || empty($allow[$_GET['page']]) || ($_GET['page'] == 'home'))
{
    // Technically a header location should be a complete URL - http://...
    header("Location: home.php");
    exit();
}
于 2009-11-17T12:07:09.087 に答える
2

大丈夫そうです。header() の後に exit() ステートメントを追加するだけで、header() が失敗した場合でもスクリプトが終了するようになります。

于 2009-11-17T12:07:08.930 に答える
0

これで十分でしょう

 $allow = array('home', 'another_one', 'blah');
 $page = isset($_GET['page']) ? $_GET['page'] : 'home';
 if(in_array($page, $allow, true))
     include "$page.php";

なぜ「ヘッダー」を使用しているのかわかりません

于 2009-11-17T12:07:12.660 に答える
0

「十分」は非常に幅の広いブラシです。少し拡大できますか?また、 $_GET['page'] を小さな値のセット (たとえば、整数、または小文字のみを含む識別子など) に制限する必要があることがわかっている場合は、正規表現でデータを検証しても問題はありません。

于 2009-11-17T12:07:15.193 に答える
0

最初に $page で正規表現を実行して、さらにチェックする前に、渡すことができるもののサニタイズされた基準を満たしていることを確認することをお勧めします。$page の内容が準拠していない場合は、それ以上処理しないでください...

于 2009-11-17T12:07:19.357 に答える