[解決済み] アップロードされたファイルのMIMEタイプは、ブラウザによってどのように決定されるのですか?
質問
ユーザーが .zip ファイルをアップロードする必要がある Web アプリがあります。 サーバー側で、アップロードされたファイルの MIME タイプをチェックし、それが
application/x-zip-compressed
または
application/zip
.
これは、Firefox と IE で正常に動作しました。 しかし、同僚がテストしたところ、彼は Firefox で失敗しました (送信された MIME タイプは " のようなものでした)。
application/octet-stream
のようなものでした)、Internet Explorerではうまくいきました。 私たちのセットアップは、IE8、FF 3.5.1、すべてのアドオン無効、Win XP SP3、ネイティブの .zip ファイル ハンドラとして WinRAR をインストール (これが関連しているかどうかは不明) という同一のものでした。
そこで質問なのですが。 ブラウザはどのように送信する MIME タイプを決定するのでしょうか?
注: 私は、MIME タイプがブラウザによって送信され、したがって、信頼できないことを知っています。 主に、zip ファイルとして非 zip ファイルを開こうとしたときに表示されるメッセージよりも親切なエラー メッセージを表示し、(おそらく重い) zip ファイル ライブラリをロードしないようにするために、便宜上それをチェックしているだけです。
どのように解決するのですか?
クローム
クローム
(執筆時点ではバージョン 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 タイプが信頼できない理由なのです。
関連
-
[解決済み] .docx、.pptxなどの正しいMIMEタイプは何ですか?
-
[解決済み] JSFでフォームアクションを定義する方法は?
-
[解決済み] Webフォームのフィールド/入力タグでブラウザのオートコンプリートを無効にするにはどうすればよいですか?
-
[解決済み] Firefox または Chrome ブラウザから HTTP POST リクエストを手動で送信する方法
-
[解決済み] MIME-typeが原因でスタイルシートが読み込まれない
-
[解決済み] CSVに使用するMIMEタイプは?
-
[解決済み] MIME タイプ 'image/jpg' は 'image/jpeg' と同じですか?
-
[解決済み】MIMEタイプとは何ですか?
-
[解決済み】GETメソッドとPOSTメソッドはいつ使うべきですか?両者の違いは何ですか?
-
[解決済み] AngularJSでフォームが無効なときに送信ボタンを無効にする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] HTML5です。2つの入力を持つスライダーは可能か?
-
[解決済み] 無料または手頃な価格のOCRおよびICR(手書き文字認識)SDK?[クローズド]
-
[解決済み] フォーム型Webサイト認証の決定版【終了しました
-
[解決済み] HTTPファイルアップロードの仕組みを教えてください。
-
[解決済み】enctype='multipart/form-data'とはどういう意味ですか?
-
[解決済み】Postman Chromeです。form-data、x-www-form-urlencoded、rawの違いは何ですか?
-
[解決済み] AngularJSでフォームが無効なときに送信ボタンを無効にする
-
[解決済み] Razorで "Html.BeginForm "を記述する方法
-
[解決済み] 生年月日を入力するのに最適なUIは?[クローズド]
-
[解決済み] フォームの再送信を防止する