拡張子に依存せずにアップロードされたファイルのコンテンツを確認する方法は?

StackOverflow https://stackoverflow.com/questions/245183

  •  05-07-2019
  •  | 
  •  

質問

拡張機能を使用せずにアップロードされたファイルのタイプを確実に検証するにはどうすればよいですか?私はあなたがヘッダーを調べる/いくつかのバイトを読む必要があると推測していますが、私はそれをどうするか本当に分かりません。 C#とasp.netを使用しています。

アドバイスありがとうございます。


OK、上記のリンクから、たとえば.jpgファイルを明確に識別するために 'ff d8 ff e0'を探していることがわかりました。

私のコードでは、最初の20バイトを問題なく読むことができます:

                FileStream fs = File.Open(filePath, FileMode.Open);
                Byte[] b = new byte[20];
                fs.Read(b, 0, 20);

だから(そして、ここで私の完全な未経験を言い訳してください)しかし、バイト配列に 'ff d8 ff e0'が含まれているかどうかを確認するにはどうすればよいですか?

役に立ちましたか?

解決

投稿したフォローアップの質問に対する素早い回答は次のとおりです。

byte[] jpg = new byte[] { 0xFF, 0xD8, 0xFF, 0xE0 };
bool match = true;
for (int i = 0; i < jpg.Length; i++)
{
    if (jpg[i] != b[i])
    {
        match = false;
        break;
    }
}

他のヒント

それは確かにUnixの file プログラムが行うことで、程度の差はあれ信頼性があります。一部には、検出しようとしているファイルを持つプログラムがファイルヘッダーを発行するかどうかに依存します。プログラム tar はそうしないことで有名です。試行および認識しようとするファイルの種類によって異なりますが、 file の実装を使用するのが最も簡単な場合があります。多くのファイルタイプを認識し、最新バージョンは、多くのシナリオを処理できる追加のファイルタイプ定義のファイルを介して拡張可能です。

ファイルの最初の数バイトは、多くの場合ファイルタイプを示します。たとえば、
http://www.garykessler.net/library/file_sigs.html
http://www.astro.keele.ac.uk/ oldusers / rno / Computing / File_magic.html

System.IOを使用して、アップロード後にバイスをバイナリとして読み取ります。

しかし、なぜContentTypeヘッダーに依存できないのでしょうか?

Wotsit は、さまざまなファイルタイプのマジックナンバーを見つけるための優れたリソースです。

ファイルの内容を読むことは、絶対確実な方法です。 .Netでビルドしているため、おそらくアップロードされたファイルのMIMEタイプを確認できます。

あなたはurlmon.dllをDllImportすることができます。次の投稿を参照してください。 http://coding-passion.blogspot.com/2008/ 11 / validating-file-type.html

そして、Content-typeを明確にするために、それは常にファイルの拡張子によって決まります。そのため、.zipファイルの拡張子も.txtに変更された場合でも、コンテンツタイプにはテキストのみが表示されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top