PHPで画像のメタデータ、バイナリITPC操作と画像の脆弱性対策

PHPで画像の扱い PHP/MySQL

iptcembed ITPCデータ取得と保存

PHP


//=================================================================
//
// IPTC タグを設定します
//
// iptcembed(iptc_data名 ,ファイル名,(int)Spoolフラグ)
//
// メタ・フィールドについて
// 参照:https://wpdocs.osdn.jp//関数リファレンス/wp_read_image_metadata
//
// 参考:https://www.php.net/manual/ja/function.iptcembed.php
//    https://runebook.dev/ja/docs/php/function.iptcembed
//

('  , 2#+ IPTCのタグ数字')
DEFINE('IPTC_OBJECT_NAME', '005');
DEFINE('IPTC_EDIT_STATUS', '007');
DEFINE('IPTC_PRIORITY', '010');
DEFINE('IPTC_CATEGORY', '015');
DEFINE('IPTC_SUPPLEMENTAL_CATEGORY', '020');
DEFINE('IPTC_FIXTURE_IDENTIFIER', '022');
DEFINE('IPTC_KEYWORDS', '025');
DEFINE('IPTC_RELEASE_DATE', '030');
DEFINE('IPTC_RELEASE_TIME', '035');
DEFINE('IPTC_SPECIAL_INSTRUCTIONS', '040');
DEFINE('IPTC_REFERENCE_SERVICE', '045');
DEFINE('IPTC_REFERENCE_DATE', '047');
DEFINE('IPTC_REFERENCE_NUMBER', '050');
DEFINE('IPTC_CREATED_DATE', '055');
DEFINE('IPTC_CREATED_TIME', '060');
DEFINE('IPTC_ORIGINATING_PROGRAM', '065');
DEFINE('IPTC_PROGRAM_VERSION', '070');
DEFINE('IPTC_OBJECT_CYCLE', '075');
DEFINE('IPTC_BYLINE', '080');
DEFINE('IPTC_BYLINE_TITLE', '085');
DEFINE('IPTC_CITY', '090');
DEFINE('IPTC_PROVINCE_STATE', '095');
DEFINE('IPTC_COUNTRY_CODE', '100');
DEFINE('IPTC_COUNTRY', '101');
DEFINE('IPTC_ORIGINAL_TRANSMISSION_REFERENCE', '103');
DEFINE('IPTC_HEADLINE', '105');
DEFINE('IPTC_CREDIT', '110');
DEFINE('IPTC_SOURCE', '115');
DEFINE('IPTC_COPYRIGHT_STRING', '116'); →'2#116'
DEFINE('IPTC_CAPTION', '120');
DEFINE('IPTC_LOCAL_CAPTION', '121');

IPTCヘッダーデータの取得 配列(タブ名 => メタデータ)

PHP




$iptcHeaderArray = array
(
	'2#005'=>'DocumentTitle',
	'2#010'=>'Urgency',
	'2#015'=>'Category',
	'2#020'=>'Subcategories',
	'2#040'=>'SpecialInstructions',
	'2#055'=>'CreationDate',
	'2#080'=>'AuthorByline',
	'2#085'=>'AuthorTitle',
	'2#090'=>'City',
	'2#095'=>'State',
	'2#101'=>'Country',
	'2#103'=>'OTR',
	'2#105'=>'Headline',
	'2#110'=>'Source',
	'2#115'=>'PhotoSource',
	'2#116'=>'Copyright',
	'2#120'=>'Caption',
	'2#122'=>'CaptionWriter'
);

画像形式の確認

PHP


//=======================================================
//
// 画像ファイルのヘッダ部分を利用して画像フォーマットの判別
//-------------------------
// フォーマット: 先頭の文字
// JPEG: FF D8
// PNG: 89 50 4E 47
// GIF: 47 49 46 38
//=======================================================
function is_jpeg(&$pict)
{
	return (bin2hex($pict[0]) == 'ff' && bin2hex($pict[1]) == 'd8');
}//

function is_png(&$pict)
{
	return (bin2hex($pict[0]) == '89' && $pict[1] == 'P' && $pict[2] == 'N' && $pict[3] == 'G');
}
//end_function-----

IPTCバイナリデータへ変換

PHP


//=================================================================
//
// Thies C. Arntzen による iptc_make_tag() 関数
//
// バイナリデータに整形
//
//=================================================================
//定式---------
// Thies C. Arntzen による iptc_make_tag() 関数
//-------------
function iptc_make_tag($rec, $data, $value)
{
	$length = strlen($value);
	$retval = chr(0x1C) . chr($rec) . chr($data);

	if ($length < 0x8000) { $retval .=chr($length>> 8) . chr($length & 0xFF);
	} else {
	$retval .= chr(0x80) .
	chr(0x04) .
	chr(($length >> 24) & 0xFF) .
	chr(($length >> 16) & 0xFF) .
	chr(($length >> 8) & 0xFF) .
	chr($length & 0xFF);
	}

	return $retval . $value;
} //end_function

IPTCメタデータへ変換、メタデータ保存

PHP



function IPTC_ImgMeta_INPUT()
{
	$path = ""; //ファイルパス
	$string = ""; //セットする文字列

	// IPTC タグを設定します
	$iptc = array(
	//($tag => $string)
	'2#120' => 'Test image',
	'2#116' => 'Copyright 2008-2009, The PHP Group-Sample'
	);

	// IPTC タグをバイナリコードに変換
	$data = '';
	foreach ($iptc as $tag => $string) {
	$tag = substr($tag, 2); //$tagの先頭2文字を取出し
	$data .= iptc_make_tag(2, $tag, $string); //function処理
	} //

	// IPTC データを埋め込み(iptcembed(データ, ファイルパス)
	$content = iptcembed($data, $path);

	// 新しい画像データをファイルに書き込みます
	$fp = fopen($path, "wb");
	fwrite($fp, $content);
	fclose($fp);
} //end_function

<?php
 //テスト
?>

タイトルとURLをコピーしました