アップロードが必要なほとんどのアプリケーションでは、事前定義されたMIMEタイプのリストに対して、ブラウザー(クライアント)から渡されたMIMEを検証することを決定することがあります。このアプローチは、ブラウザがアップロードされているファイルのMIMEタイプを通信できないという疑わしいことが起こっている場合、現時点ではわざわざ処理したくないと一般的に想定しています。
<?php
$valid_mp3_mimes = array(
'audio/mpeg',
'audio/x-mpeg',
'audio/mp3',
'audio/x-mp3',
'audio/mpeg3',
'audio/x-mpeg3',
'audio/x-mpeg-3',
'audio/mpg',
'audio/x-mpg',
'audio/x-mpegaudio',
'video/mpeg',
'video/x-mpeg',
);
$uploaded_file_mime = $_FILES['upload_field_name']['type'];
if(!in_array($uploaded_file_mime, $valid_mp3_mimes))
{
die('Upload is not a valid MP3 file.');
}
あなたはこれがあなたの目的にとって十分な方法であると感じるかもしれないし、そうでないかもしれません。PHPマニュアルには、ブラウザがこの情報を提供した場合にこの情報が利用可能であり、サーバー側でMIMEタイプがチェックされていないため、当然のことと見なされるべきではないと明示的に記載されています。
考慮すべきことの1つは、ファイルの真のMIMEタイプを認証できるようにするサーバー上のリソースの可用性です。
PHP開発者として、私たちはほとんどの部分でプラットフォームに依存しないコードを作成する柔軟性が大好きです(たとえば、XAMPPを実行するWindowsシステム上に構築されたWebアプリケーションは、ほとんど変更を加えることなくLinuxホスティング環境にデプロイできます)。ただし、MIMEタイプを検証する場合、これらのツール("file"や"finfo_file"など)の存在を確認する必要があるプラットフォーム依存のメソッドの導入を開始します。
これは、これらのツールを利用し、PHPの範囲内で取得するのとほぼ同じくらい徹底的な実例である、調査する価値のある1つの実装(CodeIgniter GitHubリポジトリから取得)である可能性があります。
ファイルMIMEタイプは、可能であれば、アップロードされたファイルの(実際の)MIMEタイプを検出します。
https://github.com/EllisLab/CodeIgniter/blob/develop/system/libraries/Upload.php#L983
ソース
PHPの手動POSTメソッドのアップロード-http ://www.php.net/manual/en/features.file-upload.post-method.php
ウェブマスターツールキットのMIMEタイプ-http ://www.webmaster-toolkit.com/mime-types.shtml
FILExt.MP3ファイル-http ://filext.com/file-extension/MP3