拡張子のブラックリストよりもホワイトリストを用意した方が良いと、ファイルアップロードの安全性に関する多くの記事で言われています。しかし、この方法では拡張子が 2 重のファイルに問題があるようです。たとえば、「pdf」、「doc」、「docx」のようなホワイトリストがありますが、このホワイト リストは apple.php.doc または apple.doc.php に対して true を返します。
安全な拡張子チェック関数を作成するにはどうすればよいですか?
拡張子のブラックリストよりもホワイトリストを用意した方が良いと、ファイルアップロードの安全性に関する多くの記事で言われています。しかし、この方法では拡張子が 2 重のファイルに問題があるようです。たとえば、「pdf」、「doc」、「docx」のようなホワイトリストがありますが、このホワイト リストは apple.php.doc または apple.doc.php に対して true を返します。
安全な拡張子チェック関数を作成するにはどうすればよいですか?
このコードを使用して、拡張機能が適切かどうかを確認します。
$valid_exts = array('doc', 'pdf');
if (in_array(pathinfo($filename, PATHINFO_EXTENSION), $valid_exts)) {
// everything is fine
} else {
// not fine
}
この理由を理解しようとする必要があります。あなたの質問は意味がありません。
特定の拡張子を許可すべきではない理由は、一部の Web サーバー (Apache など) は、それらに基づいてファイルのサーバー方法を決定するためです。もちろん、これは公開されているディレクトリ内のファイルにのみ適用されますが、ほとんどの場合、.アップロードされたファイルはそこに保存されるため、.php のようにサーバーが実行する拡張子を許可すると、Web 上のランダムな人々がサイトにコードを挿入できるようになります。
拡張子がまだ .doc であり、サーバーがそれをそのように扱うため、.php.doc では発生しません。
ディレクトリ内の特定のファイルを実行しないように Web サーバーを構成することもできますが、これはデフォルトではなく、実際に実行している人はほとんどいません。