MIME タイプと拡張子の違い — なぜ両方あるのか
拡張子はファイル名の慣習、MIME は配信時のコンテンツ表明。両者がずれるとブラウザやメーラーが誤認し、セキュリティ事故につながります。
違いを一言で
- 拡張子 (
.pdf): ファイル名の末尾。OS がどのアプリで開くかを決める慣習 - MIME (
application/pdf): HTTP / メールでの『このバイト列は何か』を相手に伝える宣言
なぜ両方必要か
- 拡張子はユーザーが自由に書き換えられる。攻撃者が
.jpgを.exeと見せかけたり、逆もできる - MIME はサーバーやメールクライアントが決定し、受信側が挙動を切り替えるために使う
両者がずれるとどうなるか
- ブラウザが PDF として開くはずが、実は EXE でダウンロードが発生
Content-Type: text/htmlで配信されてしまったアップロード画像が XSS の温床になる
サーバー側での対策
- ファイルアップロード時は拡張子と MIME 両方を検証
- File Signature Checker 的に先頭バイトで実体を判定してから配信
X-Content-Type-Options: nosniffでブラウザの MIME sniffing を無効化