クロム
Chrome (執筆時点でバージョン38)には、MIMEタイプを判別する3つの方法があり、特定の順序で判別します。以下のスニペットは、ファイルsrc/net/base/mime_util.cc
、メソッドからのものですMimeUtil::GetMimeTypeFromExtensionHelper
。
// We implement the same algorithm as Mozilla for mapping a file extension to
// a mime type. That is, we first check a hard-coded list (that cannot be
// overridden), and then if not found there, we defer to the system registry.
// Finally, we scan a secondary hard-coded list to catch types that we can
// deduce but that we also want to allow the OS to override.
ハードコードされたリストは、ファイルの少し前にあります:https://cs.chromium.org/chromium/src/net/base/mime_util.cc?l = 170(kPrimaryMappings
およびkSecondaryMappings
)。
例:Microsoft ExcelがインストールされているWindowsシステムからCSVファイルをアップロードすると、Chromeはこれをとして報告しapplication/vnd.ms-excel
ます。これは、.csv
ハードコードされた最初のリストでが指定されていないため、ブラウザがシステムレジストリにフォールバックするためです。HKEY_CLASSES_ROOT\.csv
にContent Type
設定されたという名前の値がありますapplication/vnd.ms-excel
。
インターネットエクスプローラ
再び同じ例を使用すると、ブラウザはを報告しapplication/vnd.ms-excel
ます。Internet Explorer (執筆時点ではバージョン11)がレジストリを使用していると想定するのは妥当だと思います。ChromeやFirefoxのようなハードコードされたリストも利用している可能性がありますが、クローズドソースであるため検証が困難です。
Firefox
Chromeコードに示されているように、Firefox (執筆時点ではバージョン32)も同様に機能します。ファイルからのスニペットuriloader\exthandler\nsExternalHelperAppService.cpp
、メソッドnsExternalHelperAppService::GetTypeFromExtension
// OK. We want to try the following sources of mimetype information, in this order:
// 1. defaultMimeEntries array
// 2. User-set preferences (managed by the handler service)
// 3. OS-provided information
// 4. our "extras" array
// 5. Information from plugins
// 6. The "ext-to-type-mapping" category
ハードコードされたリストは、ファイルの前の441行目の近くにdefaultMimeEntries
ありextraMimeEntries
ます。とを探しています。
私の現在のプロファイルではtext/csv
、mimeTypes.rdf
(上記のリストの項目2)にエントリがあるため、ブラウザは報告します。このエントリがない新しいプロファイルでは、ブラウザはレポートしますapplication/vnd.ms-excel
(リストの項目3)。
概要
ブラウザのハードコードされたリストはかなり制限されています。多くの場合、ブラウザによって送信されるMIMEタイプは、OSによって報告されるものになります。そして、これがまさに、質問で述べられているように、ブラウザによって報告されたMIMEタイプが信頼できない理由です。