HOME>WEBプログラム覚書>[PHP]アップロードしたファイルの種類の判定に$_FILES[][type]は使っちゃいけない。

[PHP]アップロードしたファイルの種類の判定に$_FILES[][type]は使っちゃいけない。

ブラウザとかOSによって全部バラバラじゃねーかw

詳細なバージョンとかメモってないんだけど、Windows XP のChromeとWindows 8.1 のChromeとUbuntuのChromeで試したところ application/zipapplication/x-zip-compressedapplication/octet-streamの3つが出た。

この値を信用するなってことは、当然ながらマニュアルにしっかりと書いてありましたね。はい。

$_FILES['userfile']['type']
ファイルの MIME 型。ただし、ブラウザがこの情報を提供する場合。 例えば、"image/gif" のようになります。 この MIME 型は PHP 側ではチェックされません。そのため、 この値は信用できません。

指定した型以外の ファイルを全て捨てるために変数 $_FILES['userfile']['type'] を用いることができますが、 これはあくまでいくつかのチェックの中のひとつとしてのみ実行するようにしてください。なぜなら、この値を設定するのはあくまでもクライアントであり、 PHP 側では何もチェックしていないからです。

PHP: POST メソッドによるアップロード - Manual

・・・これ廃止じゃダメなの?w
var_dumpしてtypeにimage/gifとかあったら、ファイルタイプGetだぜっ!って何の疑いもなくで使っちゃうじゃないか。
どういう用途で必要なのか想像つかないんですけど、廃止になってないってことはなんかあるのかな?

とりあえず 5.3.0以上ならfinfo_fileが利用できるので解決なんですけど、 5.3.0以下の場合はどうすりゃいいんだ?。PECL 入れられる環境なんて限られてるだろうし。

mime_content_type()かGNU/Linuxの file コマンドでなんとかするかかな。

file -i

  1. $ file -i ./icon.zip
  2. icon.zip: application/zip; charset=binary
  3.  
投稿日 2014年2月 5日 04:39
カテゴリ PHP
タグ 関数
トラックバック URL http://www.kantenna.com/cgi-bin/mt504/mt-tb.cgi/1349

コメント

画像の判別にはexif_imagetype関数(http://php.net/manual/ja/function.exif-imagetype.php)が使えます。
getimagesize関数も、返り値の2番目の要素が画像の形式の情報になっています。

コメントする
Name
Email Address
URL