ブラウザがMIMEタイプを検出するアルゴリズムの仕様書の紹介

 ブラウザの主機能に外部のサーバーからコンテンツをダウンロードする機能があります。ここでいうダウンロードとはローカルに保存するダウンロードのみでなくHTML、画像といったウェブページを構成する様々なもののダウンロードのことを指します。様々なモノをダウンロードする都合上、悪意あるリソースへの対策は必須です。
 悪意あるリソースがユーザーへ影響を与える経路の一つとして、ファイル種別の偽装が考えられます。実行ファイルでない様で実行ファイルであったりとかそういうものです。また、単に拡張子と中身を間違えているだけといった場合も考えられます。こういった自体の対策を一因としてブラウザにはファイルの中身からファイルの種類を識別する機能が備わっています。この機能のアルゴリズムは MIME Sniffing として次にまとまっています。

MIME Sniffing Standard
MIME Sniffing (日本語訳)

 ファイルには File Signature という中身の先頭付近のバイトによって形式を定めるフォーマットがあり、この MIME Sniffing ではそのバイトをどこからどう読み取ってどの様に対応するかのアルゴリズムが事細かに記述されています。

File Signatures
[File Signatures](https://www.garykessler.net/library/file_sigs.html)
【PHP】ファイルの中身からファイル形式を識別する – 株式会社シーポイントラボ | 浜松のシステム・RTK-GNSS開発

 MIME Sniffing の序文にある通り、これはブラウザ間で共通の動作です。このためオープンソースなブラウザのソースコードを読むとこの MIME Sniffing の実装を読むことができます。例えば Chromium ならば次にまとまっています。

chromium/net/base at main · chromium/chromium
chromium/mime_sniffer.cc at main · chromium/chromium

 そのままの名前です。mime_sniffer.cc の冒頭の定数あたりを見ると何をしたいか比較的わかりやすいです。

static const MagicNumber kMagicNumbers[] = {
  // Source: HTML 5 specification
  MAGIC_NUMBER("application/pdf", "%PDF-"),
  MAGIC_NUMBER("application/postscript", "%!PS-Adobe-"),
  MAGIC_NUMBER("image/gif", "GIF87a"),
  MAGIC_NUMBER("image/gif", "GIF89a"),
  MAGIC_NUMBER("image/png", "\x89" "PNG\x0D\x0A\x1A\x0A"),
  MAGIC_NUMBER("image/jpeg", "\xFF\xD8\xFF"),
  MAGIC_NUMBER("image/bmp", "BM"),
  // Source: Mozilla
  MAGIC_NUMBER("text/plain", "#!"),  // Script
  MAGIC_NUMBER("text/plain", "%!"),  // Script, similar to PS
  MAGIC_NUMBER("text/plain", "From"),
  MAGIC_NUMBER("text/plain", ">From"),
>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG