$_GET['']
リクエストをサニタイズする最善の方法は何ですか? 1つのディレクトリからのみファイルをダウンロードできるようにしたい。
$baseDir = "/home/html/xy.com/public_html/downloads/";
$path = realpath($baseDir . $_GET['file']);
次のステップは何ですか。ここで
$_GET['']
リクエストをサニタイズする最善の方法は何ですか? 1つのディレクトリからのみファイルをダウンロードできるようにしたい。
$baseDir = "/home/html/xy.com/public_html/downloads/";
$path = realpath($baseDir . $_GET['file']);
次のステップは何ですか。ここで
は、私はあなたがそこに持っている行の後にどうなるのかです:
基本的にif (dirname($path) === $baseDir) {
//Safe
}
、ファイルはあなたがサポートし、1回のパスで実際に何かを送信する前にチェックを行います。 dirname()
は末尾のパス区切り文字を残さないため、ファイル名の前に独自の/
を追加して($path
)、$baseDir
定義から削除する必要があります。
パス内の "/"、 ".."などの文字を無効にする必要があります。ありがとうございました。 – Adrian
@Adrianあなたが進める前に、これがどのように機能するのか本当に理解する必要があります。あなたのこのスクリプトは、あなたがしなければ危険にさらされる可能性があります。私の方法は、 '$ path'にあるファイルのパスが' $ baseDir'で指定されたパスと同じであることを保証します。誰かが '..'や'/'を使うと、それらのパスはもはやマッチしません。したがって、安全です。これを理解することが重要です。複数のディレクトリをチェックしていた場合、問題はもっと複雑になります。 – Brad
+1はBradのコメントです。ファイルシステムへのアクセスに対して非常に不自然である必要があることを理解することが不可欠です。 – toon81
$_GET
に$path
を割り当てる前に、値をサニタイズする必要があります。
PHPの独自のサニタイズ機能(http://php.net/manual/en/function.filter-input.phpおよびhttp://php.net/manual/en/filter.filters.sanitize.php)の使用をお勧めします。 PHP> = 5.2.0、
相対パスフラグメントが存在しないことを事後チェックするのではなく、すぐにストリッピングする方が簡単です。すでにそれはあなたのベースディレクトリから上方または下方に移動することができないことを保証
$baseDir = "/home/html/xy.com/public_html/downloads/";
$path = realpath($baseDir . basename($_GET['file']));
:あなたは値をフェッチするときだけで、すぐにbasename()
を使用しています。
間違いなく '..'を許可しないでください。 –
これはすべてですか?その後、私のスクリプトは安全ですか? – Adrian
いいえ、 '/'とファイルには含まれない他の文字を禁止します。 – jli