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
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 を優先し、サイズ・認可・ファイル検証を適用します。画像などをインライン表示する場合は検証済みの型を返し、実際のブラウザーレスポンスをテストしてください。
よくある質問
いいえ。ブラウザーの MIME 解釈と script/style の確認を制御しますが、ファイルの検証やサニタイズ、誤った Content-Type の修正、同一 origin のアップロード分離は行いません。未信頼ファイルには別 origin と添付ダウンロードを使います。