それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

偽装ファイルの中身を知る。FileInfo

ファイルの管理がいい加減で、拡張子がなく、調べるのが面倒なファイルが出来てしまった。
symfonyでアップロードするときにしっかり保存しておけばよかった。

ファイルの拡張子を調べる

アップロードするときに調べる方法は、簡単FileInfoを使う。
なんとPHP5.3からは標準に組み込みになるそうだ。

使い方にはオブジェクト指向と、C言語的なポインタ方式がある。

オススメは、オブジェクト指向のFileInfo。

<?php
$fo = new finfo(FILEINFO_MIME, "/usr/share/misc/magic");
$ret = $fo->file($file);
print $ret;
?>

これを実行すると出力にはMIME形式でファイルの種類が表示される。

$>php file_info.php

image/jpeg

ファイルでなくてもイイ

データベースに格納しているファイルや、BASE64で送信されたファイル。ファイルのバイナリがある時は次のようにする。

<?php
$file_contet = file_get_contents($file_name);
$fo = new finfo(FILEINFO_MIME, "/usr/share/misc/magic");
$ret = $fo->buffer($file_contet);
print $ret;
?>

取得に関しては、MIME関連のライブラリを使うのでおおむね良好だった。

インストール

今後はPHP標準関数になるのでインストールは不要になる。

Ubuntu (debian)の場合。

sudo pecl install fileinfo

symfonyなどでアップロードされるファイルを画像に制限したいとき。

FileInfoを用いることで簡単に画像かどうかチェックができる。
symfonyソースを読んでみたが、画像アップロード処理は放置されていて、

組み込み変数$_FILESを返すだけという仕様。ファイルのチェックやバリデーションも特にない。

action.class.php内にて

	public function validateUpload($req=null){
		$req = $req ? $req : $this->getRequest();
		foreach( $req->getFiles() as $TMP_FILE ){
			if( $this->is_image_file( file_get_contents($TMP_FILE['temp_name']))){
				move_uploaded_file( $TMP_FILE['temp_name'], "symfony_root"."/data/pics/".time() );
			};
		}
	}
	private function is_image_file($file_contet){
		$fo = new finfo(FILEINFO_MIME, "/usr/share/misc/magic");
		$ret = $fo->buffer($file_contet);
		print strpos($ret, "image") !== false;
	}

symfonyプラグインに在るけど。

ふとsymfonyみてたらPluginにあるね。あと1.2以降はForm関連で何とかなるみたい。