Content-Type はなぜ大事か
Content-Type は、サーバーが「このデータは何か」をブラウザに伝える HTTP ヘッダです。 これを間違えると、動画が再生されずダウンロードになったり、逆に危険なファイルがインラインで開いたりします。 アップロードを受ける側も、拡張子や Content-Type を鵜呑みにせず、先頭バイト(マジックバイト)で 実体を確かめるのが安全です。
拡張子と中身が食い違うファイルや、シグネチャを壊したファイルで挙動を試したいときは 壊れたファイルを、実際に各 Content-Type で配られる ダミーファイルが欲しいときは テストファイルをどうぞ。image/* や video/* を実際に配って確かめるなら サンプル画像(PNG/JPG/GIF/WebP)と サンプル動画(MP4/WebM)が使えます。
アップロードで実際に届く Content-Type の“ゆれ”
配信するとき(サーバーが名乗る)と、受け取るとき(クライアントが名乗る)で事情が違います。配信は下の表のとおりでよいのですが、アップロードで届く値は環境によってぶれます。 実務でよく踏むのは次の3つです。
- zip — 標準は
application/zipですが、Windows 由来の古いクライアントはapplication/x-zip-compressedを送ってきます。どちらも受理する必要があります。 - csv — 標準は
text/csvですが、Excel に関連付けられた環境からはapplication/vnd.ms-excelとして届くことがあります。 - pdf — 標準は
application/pdf。古い環境ではapplication/x-pdfを見かけます。
そもそも Content-Type はクライアントが自由に名乗れる値で、詐称もできます。 バリデーションを Content-Type だけに頼らず、先頭バイト(マジックバイト)で実体を確かめるのが確実です。
ヘッダの指定例
Content-Type: video/mp4Content-Type: application/zip / Content-Disposition: attachment