FlawOpen

flawopen.com/XSS/Content-type sniffing

MIME sniffing XSS:MIME の混同がブラウザーに届く仕組み

リファレンスページ
要点

ブラウザーはレスポンスの Content-Type を使ってバイト列の扱いを決めます。ユーザーが制御できるファイルを型が欠落または誤った状態で配信すると、MIME sniffing により一部のレスポンスの動作が意図と異なることがあります。正しい型と X-Content-Type-Options: nosniff を返し、アップロードをアプリの origin から分離してください。このヘッダーはブラウザー解釈のリスクを一つ減らしますが、ファイルをサニタイズせず、アップロード制御の代わりにもなりません。

アップロードが文書の境界を越える仕組み

アプリがユーザーのファイルを受け入れ、認証済みの自サイト origin から Content-Type が欠落または不一致の状態で配信するとします。ブラウザーがレスポンスを HTML 文書として解釈すると、ファイル内のマークアップがサイトの origin で有効になる可能性があります。開いた利用者には保存型 XSS やコンテンツ混同のリスクがあります。拡張子やアップロード要求の申告 MIME 型は実際のバイト形式を証明しません。

型を明示し、ダウンロードを分離する

危険 — 曖昧なヘッダーでアップロードをインライン配信
HTTP/1.1 200 OK
Content-Type: application/octet-stream
// X-Content-Type-Options がない
// 認証済みアプリと同じ origin
より安全 — 正しい型、nosniff、分離ダウンロード
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
X-Content-Type-Options: nosniff
Content-Disposition: attachment; filename="download.txt"

バイト列に合うようサーバー側で選んだ Content-Type を使い、アップロード者の申告をそのまま使わないでください。X-Content-Type-Options: nosniff は文書レスポンスの MIME sniffing を無効にし、MIME 型が不正な script や stylesheet のリクエストをブロックします。万能の XSS 対策ではありません。アップロードは別 origin から配信し、ダウンロードには Content-Disposition: attachment を優先し、サイズ・認可・ファイル検証を適用します。画像などをインライン表示する場合は検証済みの型を返し、実際のブラウザーレスポンスをテストしてください。

よくある質問

nosniff があれば任意のアップロードを安全に配信できますか?

いいえ。ブラウザーの MIME 解釈と script/style の確認を制御しますが、ファイルの検証やサニタイズ、誤った Content-Type の修正、同一 origin のアップロード分離は行いません。未信頼ファイルには別 origin と添付ダウンロードを使います。

参考資料

関連項目 クロスサイトスクリプティング(XSS、CWE-79)の仕組みと各言語での防ぎ方 — flawopen.com CSP と出力エスケープ:両方必要ですか? ReactのdangerouslySetInnerHTMLは安全? DOMPurifyだけでinnerHTMLは安全? Markdown のレンダリングは XSS に安全? SvelteはデフォルトでXSSを防げる? SVG アップロードは XSS のリスクになりますか?