2011-06-29 16 views
5

犯罪者は、アップロードしているファイルのコンテンツタイプを偽装することができます。したがって、私のページを通してサーバー上のファイルを受け取った場合、MIMEタイプとファイル拡張子を確認するだけではありません。アップロードされたファイルが実際にJPEG、GIFまたはPNGであるかどうかを確認する信頼できる方法はありますか?私は他のすべての形式を拒否する必要があります。私は少しずつファイルを読み込もうと試みることができましたが、何を探していますか?どんな提案やアイデアにも感謝します!ASP.NETファイルのアップロード:アップロードされたファイルが本当にJPEGであることを確認するにはどうすればよいですか?

答えて

5

最も簡単な方法は、入力ストリームのヘッダをチェックして、特定の署名を探すために、次のようになります。

  • 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; 
     } 

もちろん例外を処理する必要があります

+0

ASP.NETでヘッダーを確認するにはどうすればよいですか? – Kizz

+0

@Kizzが編集を編集しました – Pasman

6

アップロードされた画像からのストリームで、Bitmap.FromStream(stream)を使用してtry-catch内の画像を解析することができます。失敗した場合は、実際のイメージではないことがわかります。例外によってコード化されたと考えられますが、この場合は実際に例外を探しています。

+0

私はそれを試してみましょう... – Kizz

3

ファイルにJPEG/GIF/PNGのfile signatureがあるかどうかを確認できます。しかし、これらも攻撃者によって模倣される可能性があります(悪質なexeファイルはおそらく破損します)。または、Windowsフォームを使用するか、画像データをビットマップに変換して例外をスローするかどうかを調べることができます。

2

アップロードされたMIMEタイプを提供する必要はありません。問題は、特定のWebブラウザ(IE)がMIMEタイプを無視するということです。データが「見た目に似ている」と思えば、処理方法がわかっています。その場合、あなたが本当にやりたいことは、IEのファイルタイプの検出を模倣することです。あなたが最初の数バイトを見ていない限り、それは簡単ではありません。

"安全な"方法は、イメージを再エンコードすることです(イメージを縮小し、ファイルサイズを縮小するために画質を下げることも可能です)。これにより、攻撃者が出力に対してコントロールする量が最小限に抑えられます。 (もちろん、人々は再エンコードされた画像を評価しないかもしれないが、ほとんどのウェブサービスはそれを行う。)

さらに、画像を再エンコードすると、一般にメタデータ(例えば、カメラのシリアル番号)が取り除かれる。これは、ユーザが何かを切り取ったと思っているのに、the image editor leaves it in the thumbnailと思っているときに特に便利です。

関連する問題