2016-10-24 6 views
1

.NET Core 1.0.1の新しいWebサイトでユーザーのアップロードを受け付けます。ただ、ファイルだけでなく、イメージを許可したいだけです。 .NET Coreでこの検証を実行するにはどうすればよいですか? System.Drawingが実装されていないので、これを行うことはできませんか?アップロードされたファイルが画像であることを確認してください

This answerは有望ですが、最終的にSystem.Drawingを使用します。コンテンツの種類と拡張子を確認するだけで十分ですか?


EDIT:受け入れ答えは私が必要なものですが、私はここに私の実際の実装を共有しましょう。私は.NET Coreでこれをやっていますが、私はかなり同じコードが完全なフレームワークで動作することを確信しています。

static bool IsJpeg(Stream stream) 
{ 
    using (var br = new BinaryReader(stream)) 
    { 
     var soi = br.ReadUInt16(); 
     var marker = br.ReadUInt16(); 
     return soi == 0xd8ff && (marker & 0xe0ff) == 0xe0ff; 
    } 
} 

static bool IsPng(Stream stream) 
{ 
    using (var br = new BinaryReader(stream)) 
    { 
     var soi = br.ReadUInt64(); 
     return soi == 0x0a1a0a0d474e5089; 
    } 
} 

static bool IsGif(Stream stream) 
{ 
    using (var br = new BinaryReader(stream)) 
    { 
     var soi = br.ReadUInt32(); 
     var p2 = br.ReadUInt16(); 

     return soi == 0x38464947 && (p2 == 0x6137 || p2 == 0x6139); 
    } 
} 
+0

"コンテンツの種類と拡張子を確認するだけで十分ですか?" - どのような問題を解決しようとしているのですか?私は 'virus.exe'を' normalPicture.jpg'にリネームしてあなたのサイトにアップロードして、拡張子がそれを止めないことを確認します(そして、コンテンツタイプを設定するものは分かりません。拡張子もあまりにも大きく、ファイルを "読む"ことはできません)。 – Quantic

答えて

4

ファイルの拡張子を確認するだけでは不十分です。私はZIPファイルを作成して、拡張子を.jpgに変更して、それが有効なファイルだと思います。

イメージフォーマットには、ファイルが実際にイメージであることを潜在的に識別するために使用できる「マジックバイト」があります。 This Wikipedia entry here has a list of magic numbers you could check against

また、content-typeを偽装できます。

あなたにできることは2つあります。オリジナルの答えに指定されているコンテンツタイプと、ファイルの「マジックナンバー」をチェックします。誰かが実際に画像ではなく、これら両方のチェックをバイパスして、ダフデータをアップロードしたい場合は、別の処理を行う必要があります。

  1. ファイルがホワイトリストに拡張子を持っています:

    だから、あなたは3人の知られている警備員あなたが実装することができますがありますか? (.jpg/.jpeg/etc ...)

  2. コンテンツタイプがホワイトリストのエントリと一致していますか? (image/jpeg)
  3. 最初の2つのステップでどの種類のファイルを確認したら、マジックナンバーも一致しますか?
+0

これは完璧です。ありがとうございました! – vaindil

+0

@vaindil描画クラスがないので、これをASP.NET Coreに適用できましたか?達成したことを分かち合うことができますか?ありがとう – Techy

+0

@ ZainAlabdinTawfiq私はちょうど質問自体に私の実装を追加しました。 – vaindil

関連する問題