mimeタイプまたはファイルタイプを判別し、悪意のあるものが通過するのを防ぎ、システムにバグが入らないようにするための最良の方法は何ですか。
私の例では、スクリーニングの方法が必要なので、.mp3だけがサイトにアップロードされます。mime_content_typeがあることはわかっていますが、ファイルの作成方法と使用しているブラウザーによっては奇妙な結果が得られます。ブラウザーからデータを取得するので、少なくともそれが理解できます。
これは、mimeタイプを使用して識別するための私のコードです。
if(mime_content_type_new($_FILES["userfile"]) == 'audio/mpeg' ) { do stuff }
次に、UNIXコマンドラインを使用してそれを解釈します
$fileinfo = exec("file -b 'song.mp3'"); echo $filinfo;
これは次のようなものを出力します。
ID3バージョン2.3.0のオーディオファイルには、MPEG ADTS、レイヤーIII、v1、192 kbps、44.1 kHz、ステレオが含まれます。
そのため、このファイルタイプとの一致を並べ替えて確認できます。
$fileinfo = exec("file -b 'song.mp3'");
$filewewant = "MPEG";
$mpeg = stripos($fileinfo, $filewewant);
$filewewant = "layer III";
$mpeg3 = stripos($fileinfo, $filewewant);
if ($mpeg !== False & $mpeg3 !== False)
{ echo "success"; };
この方法は、名前付き拡張子(たとえば、名前を.pngに変更)に関係なく、より適切に機能するように見えますが、最初にファイルを保存してから並べ替える必要があり、Windowsでは機能しません。
http://pear.php.net/package/MIME_Typeも指摘されています
他の誰かがそれを行うためのより良い方法を持っていますか?サーバーにアップロードされているファイルを識別する正しい方法は何ですか?