画像のマジックナンバーを眺めてみた

マジックナンバー=画像識別のための共通文字列

参考URL:
マジックナンバーまとめ - Qiita
(他に、音声動画、実行ファイルもあり参考になりました)


ファイルの先頭に存在する。バイナリエディタでも確認できるが、

<?php
/* png画像 */
$path1 = "./images/cat.png";
$fp = fopen($path1, "rb");
$m = fread($fp, 4);
var_dump(bin2hex($m));    /* 89504e47(ハックGOよいよな) */
fclose($fp);
var_dump(exif_imagetype($path1) == IMAGETYPE_PNG);

/* jpg画像(.jpegではない) */
$path2 = "./images/fuji.jpg";
$fp = fopen($path2, "rb");
$m2 = fread($fp, 4);
var_dump(bin2hex($m2));    /* ffd8ffe1 */
fclose($fp);
var_dump(exif_imagetype($path2) == IMAGETYPE_JPEG);

/* bmp */
$path3 = "./images/logo.bmp";
$fp = fopen($path3, "rb");
$m3 = fread($fp, 2);    /* バイト数が異なる */
var_dump(bin2hex($m3));    /* 424d */
fclose($fp);
var_dump(exif_imagetype($path3) == IMAGETYPE_BMP);
?>

pngの場合の語呂が良い。
ただし、以下の場合でもファイルをjpgと認識してしまう。

<?php
$contents = hex2bin("ffd8ffe1") . "honyarara";
$path4 = "./images/honyarara.txt";    /* 拡張子が.txtだが.. */
$txt = file_put_contents($path4, $contents);
var_dump(exif_imagetype($path4) == IMAGETYPE_JPEG);    /* true */
?>

よくよく考えれば当然だが、
(文字列の)"ffd8ffe1" . "honyarara"として普通に間違えた。