PHPで画像形式の判定 getimagesize(), exif_imagetype() 関数、画像の脆弱性対策

PHPで画像処理プログラム PHP/MySQL

getimagesize()関数 の返り値[2]、 画像タイプを判定する

PHP


//--------------------------------
//getimagesize()関数の返り値
//$img_info[2]の値 
//---------------------------------
function Check_getimagesize_type($int)
{
$imageTypeArray = array(
0 => 'UNKNOWN',
1 => 'GIF',
2 => 'JPEG',
3 => 'PNG',
4 => 'SWF',
5 => 'PSD',
6 => 'BMP',
7 => 'TIFF_II',
8 => 'TIFF_MM',
9 => 'JPC',
10 => 'JP2',
11 => 'JPX',
12 => 'JB2',
13 => 'SWC',
14 => 'IFF',
15 => 'WBMP',
16 => 'XBM',
17 => 'ICO',
18 => 'COUNT'
);
$type = $imageTypeArray[$int];

return $type;
} //end_function

exif_imagetype() 関数 画像形式を判定する

PHPマニュアル日本語 exif_imagetype() を画像の先頭バイトを読み そのサインを調べる。exif_imagetype() は、他の exif 関数がサポートしていないファイル形式で コールされるの防いだり、$_SERVER[‘HTTP_ACCEPT’] と組み合わせて閲覧者が画像を見る権限を持っているかどうかを調べたりするために 使用可能。

PHP


//===============================================================
// ■ exif_imagetype() 関数
//
// getimagesize()の返り値[2]のtypeと同じ値。
// getimagesize()より判定が速い。
//
//  参照:https://www.php.net/manual/ja/function.exif-imagetype.php
//
//------------------
値 定数
1 IMAGETYPE_GIF
2 IMAGETYPE_JPEG
3 IMAGETYPE_PNG
4 IMAGETYPE_SWF
5 IMAGETYPE_PSD
6 IMAGETYPE_BMP
7 IMAGETYPE_TIFF_II (intel byte order)
8 IMAGETYPE_TIFF_MM (motorola byte order)
9 IMAGETYPE_JPC
10 IMAGETYPE_JP2
11 IMAGETYPE_JPX
12 IMAGETYPE_JB2
13 IMAGETYPE_SWC
14 IMAGETYPE_IFF
15 IMAGETYPE_WBMP
16 IMAGETYPE_XBM
17 IMAGETYPE_ICO
18 IMAGETYPE_WEBP

安全な拡張子確認方法

exif_imagetypeで、ファイルのバイナリデータで拡張子が正しいかを確認する。
更新日:

脆弱性への対策、PHPでの画像情報判別

getimagesize()関数で判別

PHPで画像をリサイズする際によく使う関数。以前にPHPのカテゴリで画像サイズの変更を行っているので参考にしてください。 getimagesize()関数を使った判別は画像ではない場合は警告を出す。画像かどうかの判別以外にも、縦横サイズその他の情報まで読み取っているので処理がやや重たくなる。@getimagesize()とすると警告が出ない状態にすることが出来る。

exif_imagetype()関数で判別

画像ファイルにはヘッダー部を読み取って、ファイル形式を判定する。

PHP


function is_img($file)
{
    if (!(file_exists($file) && ($type=exif_imagetype($file)))) return false;

    switch ($type) {
        case IMAGETYPE_GIF:
            return 'gif';
        case IMAGETYPE_JPEG:
            return 'jpg';
        case IMAGETYPE_PNG:
            return 'png';
        default:
            return false;
    }
}

画像ヘッダー偽装できるので対策が必要

画像ヘッダーの開始文字が規定で決まっていて、ファイルの拡張子判定に使われている。ファイルの先頭部分に、画像拡張子のヘッダーと同じ文字列で記述して、画像形式になりすました偽装が可能。説明されているサイトがあるので参考を。 exif_imagetype()だけで画像かどうかを判別してはいけない

PHPで画像を特定ディレクトリに保存

保存先のディレクトリは相対パスで指定する。

PHP


// ファイルへのパス$path = './test/';
// ファイルがアップロードされているかと、POST通信でアップロードされたかを確認
if( !empty($_FILES['file1']['tmp_name']) && is_uploaded_file($_FILES['file1']['tmp_name']) ){
	// ファイルを指定したパスへ保存する
	if( move_uploaded_file( $_FILES['file1']['tmp_name'], $path.'upload_pic.jpg') ) {
		echo 'アップロードされたファイルを保存しました。';
	}else{
		echo 'アップロードされたファイルの保存に失敗しました。';
	}//
}//end_if

CentOSでのファイルアップロード

composer で class.upload.php をインストールする。説明しているサイトがあったので参考に。 ファイルアップロード参考サイト
タイトルとURLをコピーしました