今日画像をアップロードして画像の MIME 値を確認していて、特殊なケースでは finfo_file で取得した MIME 値を直接使用できないことに突然気づきました。
公式の書き方によると
$finfo=finfo_open(FILEINFO_MIME);
$mime=finfo_file($finfo,$file_path);
finfo_close($finfo);
アラート($mime);
次のようにファイルの MIME タイプを取得します
しかし今日、これが機能しないことがわかりました。ファイル転送中に転送タイプをバイナリ ストリームに設定する文字セットがある場合、次の図のようなものが表示されます。
余分なセミコロンと charset=binary があることがはっきりわかります
ここでファイル MIME 値が検証された場合、それが正しく合法的なファイル タイプであっても、取得した MIME の後にバイナリ ファイル ストリーム文字列「; charset=binary」の余分な部分があるため、検証に合格しません。価値
$file_name = $_FILES['imgFile']['name'];
$temp_arr =explode(".", $file_name);
$file_ext = array_pop($temp_arr);
$file_ext = トリム($file_ext);
$file_ext = strto lower($file_ext);
if(empty($mime) || !in_array($mime,$_mime[$file_ext])){
alert('画像 MIME タイプ エラー!');
}
MIME タイプの互換性を取得する修正された一般的な方法は次のとおりです (赤い部分に注意し、複数の要件環境と互換性のある正規表現を使用して正しい MIME 値を取得します)。
if(empty($mime) && function_exists('finfo_open')){
$finfo=finfo_open(FILEINFO_MIME);
$mime=finfo_file($finfo,$file_path);
finfo_close($finfo);
//特殊なアプリケーションや特殊な環境でのファイルアップロードのMIME正確な検証に対応
$new=preg_match('/([^;]+);?.*$/',$mime,$match);
if($new) $mime=trim($match[1]);
アラート($mime);
}
このようにして、互換性のある環境で MIME タイプを正しく取得し、正しいファイル MIME の正当性を確認できます。実行結果は図に示すとおりです。