中の人
【php finfo】ファイルのmimetypeをちゃんと判定する
公開: 2022-09-16 19:11
更新: 2023-04-05 23:23
php
finfo
mimetype
こんにちは!
中の人です。
ファイルアップロードてリスクいっぱいで、色々とバリデーションを実装することになると思います。
メモ程度ですが、拡張子が本来のファイルタイプと違うファイルから、本来のファイルタイプを判定する方法を紹介します。
finfoクラス
このクラス使うとちゃんとファイルタイプを判定してくれます。
今回、pngファイルを圧縮して、zipファイルの拡張子を変えて挙動を確認してみます。
正常な場合
<?php
$file = $_FILES['file'];
// $file['name'] -> 'beginner_engineer_blog.png.zip'
// $file['type'] -> 'application/zip' 👈
// $file['tmp_name'] -> '/tmp/phpO4eQDg'
// $file['error'] -> 0
// $file['size'] -> 12345
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mime_type = $finfo->file($file['tmp_name']);
// $mime_type -> 'application/zip' 👈
$_FILESのtypeと、finfoのmime_typeが一致してますね。
多分問題ないでしょう。
異常な場合
そしたら先ほどのzipファイルを.jpgに変えてアップロードしてみます。
<?php
$file = $_FILES['file'];
// $file['name'] -> 'beginner_engineer_blog.png.jpg'
// $file['type'] -> 'image/jpeg' 👈
// $file['tmp_name'] -> '/tmp/phpoiB7h1'
// $file['error'] -> 0
// $file['size'] -> 12345
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mime_type = $finfo->file($file['tmp_name']);
// $mime_type -> 'application/zip' 👈
$_FILESのtypeは
image/jpeg
ですが、finfoのmime_typeは
application/zip
のままですね!
おー(゚∀゚ )
終わりに
今回紹介したやり方以外でも判定することできるみたいですので、気になった方はいろいろ調べてみましょう!
以上です。
お疲れした!
通信エラーが発生しました。