👨‍💻

【Web開発】MIMEタイプとは?ファイルアップロードで拡張子ではなくMIMEタイプを使う理由

に公開

はじめに

Webアプリケーションでファイルアップロード機能を実装する際、「どんなファイルを受け付けるか」を制御する必要があります。このとき、拡張子ではなくMIMEタイプで判定することが推奨されています。

本記事では、MIMEタイプとは何か、なぜ拡張子判定では不十分なのかを解説します。

MIMEタイプとは

MIME(Multipurpose Internet Mail Extensions)タイプは、ファイルの中身の形式を表す標準的な識別子です。

簡単に言うと、「このデータは何の種類か?」を厳密に表すための正式なフォーマットですね。

基本構造

MIMEタイプは次の形式で表現されます。

タイプ / サブタイプ

主なMIMEタイプの例

MIMEタイプ 意味
image/jpeg JPEG画像
image/png PNG画像
application/json JSONデータ
text/html HTMLファイル
application/pdf PDFファイル
text/csv CSVファイル
video/mp4 MP4動画

拡張子判定の危険性

ファイルの種類を判定する方法として、拡張子とMIMEタイプの2つがありますが、それぞれに違いがあります。

拡張子による判定の問題点

拡張子はユーザーが自由に変更できるため、セキュリティリスクがあります。

具体例を見てみましょう。

ケース1: ウイルスファイルの偽装

元のファイル: virus.exe(実行ファイル)

名前を変更: virus.jpg

拡張子判定: .jpg → OK

結果: 危険なファイルがアップロードされる

拡張子だけで判定すると、中身が実行ファイルでも .jpg という拡張子があれば通過してしまいます。

MIMEタイプによる判定のメリット

一方、MIMEタイプはファイルの実際の中身を見て判定します。

同じケースでMIMEタイプ判定

ファイル: virus.jpg(拡張子は偽装)

MIMEタイプ判定: application/octet-stream(実行ファイル)

許可リスト: image/jpeg, image/png のみ

結果: アップロード拒否

このように、MIMEタイプで判定することで、偽装されたファイルを検出できます。

判定方法の比較

判定方法 信頼性 セキュリティ
拡張子判定 低い 偽装可能
MIMEタイプ判定 高い 中身を判定可能

MIMEタイプによる制御の実務的な理由

実際の開発現場では、次の3つの理由からMIMEタイプによる制御が重要とされています。

1. セキュリティ対策

アップロードを許可するファイル種類を制限することで、以下のようなファイルをブロックできます。

  • 実行ファイル(.exe、.bat など)
  • スクリプトファイル(.js、.php など)
  • マルウェア

2. システムの安定性

想定外のファイル形式を受け入れると、システムに負荷がかかる可能性があります。

MIMEタイプで制御することで、次のような問題を防げます。

  • メモリの過剰使用
  • ストレージの圧迫
  • 処理時間の増大

3. API仕様の遵守

APIの設計仕様を守るために、受け入れるファイル形式を明確にする必要があります。

例: 画像アップロードAPI

許可するMIMEタイプ: image/jpeg, image/png

これにより以下を防ぐ
- PDFファイルのアップロード
- Excelファイルのアップロード
- 動画ファイルのアップロード

仕様違反のリクエストを早期に検出し、適切なエラーメッセージを返すことができます。

よく使うMIMEタイプ一覧

開発でよく扱うMIMEタイプをまとめました。

画像ファイル

拡張子 MIMEタイプ
.jpg / .jpeg image/jpeg
.png image/png
.gif image/gif
.webp image/webp
.svg image/svg+xml

ドキュメントファイル

拡張子 MIMEタイプ
.pdf application/pdf
.csv text/csv
.txt text/plain
.json application/json
.xml application/xml

メディアファイル

拡張子 MIMEタイプ
.mp4 video/mp4
.mp3 audio/mpeg
.wav audio/wav

圧縮ファイル

拡張子 MIMEタイプ
.zip application/zip
.tar application/x-tar
.gz application/gzip

まとめ

MIMEタイプは、ファイルの中身の形式を表す標準的な識別子です。

ファイルアップロード機能を実装する際は、次の理由からMIMEタイプによる判定が推奨されます。

  • 拡張子は偽装可能だが、MIMEタイプは中身で判定できる
  • セキュリティリスクを低減できる
  • システムの安定性を保てる
  • API仕様を明確に守れる

実務では、拡張子ではなくMIMEタイプで制御することが、より安全で堅牢なシステムを作る基本となります。

Discussion