ユーザーがリモート URL から画像をコピーまたはダウンロードしたり、コンピューターからファイル (pdf や txt ファイルなどを含む場合があります) をアップロードしたりできるようにしたいと考えています。これを行うために、ホストがサポートしている file_get_contents と curl を試しました。ローカル アップロードでは、php を使用しています。それらは、データを転送する基本的な仕事を行います。ただし、ファイルの内容を検証して、悪意のあるコードの拡散やサーバーへの過度に大きなファイルのロードを回避する最善の方法を見つけようとしています。
多くの場合、ファイルは動的に生成されるため、既知の拡張子で終わることはないため、ファイル拡張子をチェックすることはオプションではなく、セキュリティが不足しています。
ヘッダーから MIME タイプを使用することは 1 つのオプションであり、それを行うためのコードがあります。
$file_info = new finfo(FILEINFO_MIME); // object oriented approach!
$mime_type = $file_info->buffer(file_get_contents($file)); // e.g. gives "image/jpeg"
switch($mime_type) {
case "image/jpeg":
// your actions go here...
}
ただし、明らかに、MIME タイプをスプーフィングするのはそれほど難しくありません。
いくつかの投稿では、ファイルの先頭にあるマジック ナンバーをスニッフィングすることを提案していますが、これらもスプーフィングされる可能性があります。
画像の限られたケースでは、使用できます
$imginfo_array = getimagesize($tempFile);
私の知る限り、これは pdf やドキュメントなどでは機能しません。
これらの方法を合わせても、あまり堅牢ではないようです。しかし、多くのサイトでは、リモート ファイルのアップロード、ピン留め、またはその他の方法での取得が定期的に許可されており、何らかの方法でセキュリティの問題を管理しています。
curl と file_get_contents と wd のように、セキュリティと検証のベスト プラクティス、およびサーバーに転送する前にファイル サイズとファイル タイプを取得するための他のライブラリやその他の手法に関する提案をいただければ幸いです。
注: .jpg や .gif などの主流の画像形式の転送と、pdf ファイル、doc および docx ファイル、xls ファイル、および同様の一般的な形式のアップロードを許可したいと考えています。
推奨事項とアドバイスをお寄せいただきありがとうございます。