1

基本的に私がやりたいことは次のとおりです。

include($_SERVER['REQUEST_URI']);

問題は、これが安全でないことです。
それが指すか、サブディレクトリであれば安全"/allowed/directory/"です。
だから私はstartsWith( "/allowed/directory /")でそれをテストします。

しかし、私はまだ次のようなことを恐れています:

"allowed/directory/../../bad/directory"

文字列が特定のディレクトリを指しているか
、php のサブディレクトリの 1 つを指しているかを確認する方法はありますか?

(基本的にすべての /../ を適用します - または、別のセキュリティ上の欠陥がありませんか?)

4

2 に答える 2

1

PHP 関数realpath()は、パスから ../ /// を削除する必要があります。

あなたの言う通りですが、これはかなり危険な操作になる可能性があります。IMOパスは、既知の文字セット(「a-zA-Z_」や/など)に制限する必要があります。また、パス文字列は既知のサイズ (256 文字など) に制限する必要があります。

于 2013-02-20T04:32:00.430 に答える
0

プレフィックスが正しいと判断したら、次のように preg_match を使用できます。

if(preg_match("#^[A-Za-z0-9/]+#", $string) {
    // correct
}
else {
    // incorrect
}

チェックしている変数部分 (非静的部分) は、通常、英数字だけにする必要があります。

includeローカル PHP ファイルをインクルードし、入力を適切に検証する (その入力をシンプルに保つ) ために使用している限り、問題はありません。細心の注意を払い、徹底的にテストしてください。通常、ユーザー入力を などの機密性の高い関数に渡さないようにする必要がありますinclude。しかし、フレームワークを使用すると、それを回避することが難しい場合があります。

他にできることは、正確な比較を行うための有効な入力のリストを用意することです。これをiniファイルに入れ、parse_ini_fileでロードできます。通常、これが最も安全な方法ですが、もう少し作業が必要です。PHP ファイルを配列とともに使用することもできます。これは、APCでより適切に機能します。

于 2013-02-20T04:22:36.070 に答える