PHPまとめ - 画像ファイル判別

HOME | TOP

■ 概要

第三者によってアップロードされたファイルなど、どういうファイルタイプか判らないと処理を続行できない場面があります。

その中でもホントに画像ファイルかどうかをチェックしたい場合がよくあるので画像タイプの判別法を考えます。


■ getimagesize()関数で判別

getimagesize()関数を使った判別はよく使われてるようです。

でもこの関数、画像ファイルと認識できないと警告を出すので

@getimagesize()

のように関数頭に"@"を付加して警告が出るのを抑制するのが常套のようです。

この関数は画像かどうかの判別以外にも、縦横サイズその他の情報まで読み取っているので余分な処理の分だけ重くなります。

また、"@"演算子で警告抑制すると更に重くなるので画像判別だけのケースでは使わないことにします。


■ exif_imagetype()関数で判別

exif_imagetype()関数を使って、よく使う画像タイプである"gif""jpg""png"のうちのどれかならその拡張子を返し、それ以外なら「偽」を返すis_img()関数を作ってみます。

まず渡されたファイルの存在をチェックし、次にexif_imagetype()関数に判別してもらっています。

exif_imagetype()関数は他にも"BMP"や"TIFF"なども判別できるのでここにcase文を増やしていき、より多くに対応することもできます。


■ ファイルヘッダーを読み取って判別

画像ファイルにはヘッダー部があり、決められたファイル構造(フォーマット)になっているのでこれで判別する方法です。

前出のexif_imagetype()関数も内部で同様の処理をしているという意味では同じ判別法になります。

まず渡されたファイルが存在するかどうかチェックし、存在していればそのファイルの先頭8バイトを読み込んでいます。

この8バイト読みは、"png"ファイルヘッダーの固定値が8バイトといちばん多いからこれに合わせているだけです。

"jpg"は先頭2バイトしか見てないですが一応バイナリコードが含まれているのでまだいいですが、"gif"ファイルはアスキーコードだけをチェックしているので簡単に偽装されてしまいそうですね。まぁ簡易的な判別ということで・・


2010(C)Mingw