コンテンツにスキップ

ファイルシグネチャ(マジックバイト)一覧

ファイルの先頭数バイトに含まれるシグネチャ(マジックバイト)の一覧。ファイルタイプの判定・バリデーション実装の参考に。

マジックバイトとは

多くのファイル形式は、ファイルの先頭部分に固定のバイト列(シグネチャ)を持ちます。このバイト列を「マジックバイト」または「ファイルシグネチャ」と呼びます。OSやアプリケーションはこのシグネチャを見てファイルの種類を判定します。拡張子は容易に偽装できますが、マジックバイトはバイナリレベルの識別子のため、ファイルバリデーションの信頼性が高まります。

Linuxの file コマンドや、PHPの finfo クラスはこの仕組みを使ってMIMEタイプを判定しています。

画像ファイル

形式拡張子マジックバイト(16進数)ASCII表現オフセット
PNG.png89 50 4E 47 0D 0A 1A 0A‰PNG\r\n\x1a\n0
JPEG.jpg/.jpegFF D8 FF0
GIF87a.gif47 49 46 38 37 61GIF87a0
GIF89a.gif47 49 46 38 39 61GIF89a0
WebP.webp52 49 46 46 ?? ?? ?? ?? 57 45 42 50RIFF????WEBP0
BMP.bmp42 4DBM0
TIFF(リトルエンディアン).tiff/.tif49 49 2A 00II*\00
TIFF(ビッグエンディアン).tiff/.tif4D 4D 00 2AMM\0*0
AVIF / HEIF.avif/.heif66 74 79 70ftyp4
ICO.ico00 00 01 000
SVG.svg<?xml または <svgテキスト0(BOMなし)

ドキュメント・アーカイブ

形式拡張子マジックバイト(16進数)備考
PDF.pdf25 50 44 46 2D%PDF-
ZIP.zip50 4B 03 04PK\x03\x04
ZIP(空ファイル).zip50 4B 05 06
GZIP.gz1F 8B
7-Zip.7z37 7A BC AF 27 1C7z\xBC\xAF'\x1C
RAR4.rar52 61 72 21 1A 07 00Rar!\x1A\x07\x00
RAR5.rar52 61 72 21 1A 07 01 00
TAR.tar75 73 74 61 72ustar(オフセット257)
DOCX / XLSX / PPTX.docx等50 4B 03 04ZIPベース(拡張子で区別)
XLS(旧形式).xlsD0 CF 11 E0 A1 B1 1A E1OLE2 コンテナ
DOC(旧形式).docD0 CF 11 E0 A1 B1 1A E1OLE2 コンテナ

テキスト・データ形式

形式拡張子マジックバイト / BOM備考
UTF-8 BOM付き.txt/.csv等EF BB BFBOM(Byte Order Mark)
UTF-16 LE BOM.txt等FF FEリトルエンディアン
UTF-16 BE BOM.txt等FE FFビッグエンディアン
UTF-32 LE BOM.txt等FF FE 00 00
JSON(通常).json7B または 5B{ または [
CSV(通常).csvテキスト(BOMなし)シグネチャなし
XML.xml3C 3F 78 6D 6C<?xml

音声・動画

形式拡張子マジックバイト(16進数)備考
MP3.mp3FF FB / FF F3 / FF F2またはID3タグ: 49 44 33
MP4 / M4A / M4V.mp4等66 74 79 70ftyp(オフセット4)
WAV.wav52 49 46 46 ?? ?? ?? ?? 57 41 56 45RIFF????WAVE
OGG.ogg/.ogv4F 67 67 53OggS
FLAC.flac66 4C 61 43fLaC
AVI.avi52 49 46 46 ?? ?? ?? ?? 41 56 49 20RIFF????AVI
MKV / WebM.mkv/.webm1A 45 DF A3EBML ヘッダー

実行ファイル・その他

形式拡張子マジックバイト(16進数)備考
ELF(Linux実行ファイル)なし/.elf7F 45 4C 46\x7FELF
PE(Windows実行ファイル).exe/.dll4D 5AMZ
Mach-O(macOS実行ファイル)なしCF FA ED FE64bit
PHP スクリプト.php3C 3F 70 68 70<?php
SQLite.sqlite/.db53 51 4C 69 74 65 20 66 6F 72 6D 61 74 20 33 00SQLite format 3\0
ISO.iso43 44 30 30 31オフセット32769: CD001

PHP でのマジックバイト検証の実装例

 ['offset' => 0, 'bytes' => "\x89PNG\r\n\x1a\n", 'length' => 8],
        'jpg'  => ['offset' => 0, 'bytes' => "\xFF\xD8\xFF",       'length' => 3],
        'gif'  => ['offset' => 0, 'bytes' => "GIF8",               'length' => 4],
        'pdf'  => ['offset' => 0, 'bytes' => "%PDF-",              'length' => 5],
        'zip'  => ['offset' => 0, 'bytes' => "PK\x03\x04",         'length' => 4],
        'exe'  => ['offset' => 0, 'bytes' => "MZ",                 'length' => 2],
    ];

    if (!isset($signatures[$expectedType])) {
        throw new \InvalidArgumentException("未知のファイルタイプ: $expectedType");
    }

    $sig = $signatures[$expectedType];
    $handle = fopen($filePath, 'rb');
    if ($sig['offset'] > 0) fseek($handle, $sig['offset']);
    $header = fread($handle, $sig['length']);
    fclose($handle);

    if (substr($header, 0, $sig['length']) !== $sig['bytes']) {
        throw new \RuntimeException("マジックバイトが一致しません(期待: $expectedType)");
    }
}

// 使用例
validateMagicBytes($_FILES['upload']['tmp_name'], 'png');
echo "正当なPNGファイルです";

関連リソース