IEでjpegとPNG画像をアップロードする際、MIME Type(Content Type)が普通と違う件

アップロードされたファイルが画像かどうかを判別する際、MIME Typeを見る方法があります。
この情報は、ブラウザの自己申告なため、悪意をもって全然別のMIME Typeを送信する事も可能*1ですが、IEMIME Typeを偽装?してきます。

jpeg
image/pjpeg
PNG
image/x-png

IE6〜IE8では、それぞれこのようなMIME Typeを送ってくるようです。
ようです。と書いてるのは、IE8でしか試していないからです。
IE8で2、3枚のjpegPNG画像を実際にアップロードして、このMIME Typeになる事を確認しました。
正しいMIME Typeを送出する場合もあるかもしれませんが、判別できさえすればよかったので、なぜこんなMIME Typeになるかは調べてません。
IE6とIE7に関しては、同様の報告をしてる記事を他に見かけました。
これらの情報を合わせると、とりあえずIE6〜IE8は要注意かなと。

例えばjpeg, PNG, GIFを扱う場合

  • image/gif
  • image/png
  • image/jpg
  • image/jpeg
  • image/pjpeg
  • image/x-png

IE用に2個追加して、こんなMIME Typeで判別します。

switch ($mimeType){
    case 'image/gif':
    case 'image/png':
    case 'image/jpg':
    case 'image/jpeg':
    case 'image/pjpeg':
    case 'image/x-png':
        //画像を処理するコード
        break;
    default:
        break;
}

phpjpeg, PNG, GIFにだけなんか処理をする場合は、こんな感じで判別するとか。

*1:サーバー側で実際のデータからMIME Typeを判別する等がより安全ですが、簡易にMIME Typeで判別する事もあります。