犯罪者は、アップロードしているファイルのコンテンツタイプを偽装することができます。したがって、私のページを通してサーバー上のファイルを受け取った場合、MIMEタイプとファイル拡張子を確認するだけではありません。アップロードされたファイルが実際にJPEG、GIFまたはPNGであるかどうかを確認する信頼できる方法はありますか?私は他のすべての形式を拒否する必要があります。私は少しずつファイルを読み込もうと試みることができましたが、何を探していますか?どんな提案やアイデアにも感謝します!ASP.NETファイルのアップロード:アップロードされたファイルが本当にJPEGであることを確認するにはどうすればよいですか?
答えて
最も簡単な方法は、入力ストリームのヘッダをチェックして、特定の署名を探すために、次のようになります。
- JPEG:FF D8進で
- GIF:最初の3つのバイト "GIF"
- PNG :ASP.NETにおける小数
例137 80 78 71 13 10 26 10
bool isValid = false;
char[] header = new char[10];
StreamReader sr = new StreamReader(Request.InputStream);
sr.Read(header, 0, 10);
// check if JPG
if (header[0] == 0xFF && header[1] == 0xD8)
{
isValid = true;
}
// check if GIF
else if (header[0] == 'G' && header[1] == 'I' && header[2] == 'F')
{
isValid = true;
}
// check if PNG
else if (header[0] == 137 && header[1] == 80 && header[2] == 78 && header[3] == 71 && header[4] == 13 && header[5] == 10 && header[6] == 26 && header[7] == 10)
{
isValid = true;
}
もちろん例外を処理する必要があります
アップロードされた画像からのストリームで、Bitmap.FromStream(stream)
を使用してtry-catch内の画像を解析することができます。失敗した場合は、実際のイメージではないことがわかります。例外によってコード化されたと考えられますが、この場合は実際に例外を探しています。
私はそれを試してみましょう... – Kizz
ファイルにJPEG/GIF/PNGのfile signatureがあるかどうかを確認できます。しかし、これらも攻撃者によって模倣される可能性があります(悪質なexeファイルはおそらく破損します)。または、Windowsフォームを使用するか、画像データをビットマップに変換して例外をスローするかどうかを調べることができます。
アップロードされたMIMEタイプを提供する必要はありません。問題は、特定のWebブラウザ(IE)がMIMEタイプを無視するということです。データが「見た目に似ている」と思えば、処理方法がわかっています。その場合、あなたが本当にやりたいことは、IEのファイルタイプの検出を模倣することです。あなたが最初の数バイトを見ていない限り、それは簡単ではありません。
"安全な"方法は、イメージを再エンコードすることです(イメージを縮小し、ファイルサイズを縮小するために画質を下げることも可能です)。これにより、攻撃者が出力に対してコントロールする量が最小限に抑えられます。 (もちろん、人々は再エンコードされた画像を評価しないかもしれないが、ほとんどのウェブサービスはそれを行う。)
さらに、画像を再エンコードすると、一般にメタデータ(例えば、カメラのシリアル番号)が取り除かれる。これは、ユーザが何かを切り取ったと思っているのに、the image editor leaves it in the thumbnailと思っているときに特に便利です。
- 1. ファイルがアップロードされたことを確認するにはどうすればよいですか?
- 2. アップロードされたファイルがCSVファイルであるかどうかを確認
- 3. アップロードされたファイルがMIMEタイプのない画像であるかどうかを確認するにはどうすればよいですか?
- 4. ファイルがコントローラにアップロードされていることをテストするにはどうすればよいですか?
- 5. アップロードされたファイルが実際のイメージファイルであることを確認することは重要ですか?
- 6. ASP.NETでアップロードされたファイルのMIMEタイプを検出するにはどうすればよいですか?
- 7. ファイルが正しくアップロードされたことをどのように確認できますか?
- 8. サーバーにアップロードされたファイルの妥当性確認
- 9. すべてのファイルがいつdropzone.jsにアップロードされたかを確認する
- 10. ユーザーがファイルをアップロードするファイルを選択したかどうかを確認するにはどうすればよいですか?
- 11. ファイルが空であることを確認するにはどうすればよいですか?
- 12. mod_pythonでファイルをアップロードするにはどうすればよいですか?
- 13. 複数のファイルをアップロードするにはどうすればよいですか?
- 14. ファイルがアップロードされているかどうか確認してください。
- 15. jqueryのファイルは、ファイルのアップロードが選択されているかどうかをどうやって確認することができ、ファイルの値
- 16. アップロードされたファイルの拡張子をPHPで取得するにはどうすればよいですか?
- 17. PDFファイルをアップロードするにはどうすればよいですか?
- 18. ファイルが空であるかどうかを確認するにはどうすればよいですか?
- 19. 検証:アップロードされるファイルがExcel形式であるかどうかを確認する方法は? - Apache POI
- 20. Ruby on Railsでアップロードされたファイルのサイズを調べるにはどうすればよいですか?
- 21. ウィンドウフォームでファイルをアップロードするにはどうすればいいですか?
- 22. FileUpload - 実際のファイルがアップロードされたことを確認します。
- 23. DLLファイルがコンパイルされた.NET Frameworkのバージョンを確認するにはどうすればよいですか?
- 24. asp.netでアップロードされた[テキストベース]ファイルのMIMEタイプを確実に検出するにはどうすればよいですか?
- 25. アップロードされたファイルがUTF-8またはUTF-16であるかどうかを調べるにはどうすればよいですか?
- 26. ASP.Netを使用してアップロードされたファイルのコンテンツタイプを確認する
- 27. 内部Windows認証イントラネットで複数のファイルをアップロードするにはどうすればよいですか?
- 28. ASP.NETで同じユーザーであることを確認するにはどうすればよいですか?
- 29. アップロードされたファイルをフォームオブジェクトプロパティにバインドするにはどうすればいいですか?
- 30. ファイルがcodeigniterでアップロード用に選択されているかどうかを確認してください
ASP.NETでヘッダーを確認するにはどうすればよいですか? – Kizz
@Kizzが編集を編集しました – Pasman