2

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も指摘されています

他の誰かがそれを行うためのより良い方法を持っていますか?サーバーにアップロードされているファイルを識別する正しい方法は何ですか?

4

2 に答える 2

1

MIMEタイプは、ファイルのMIMEヘッダー(MIMEを示すファイルの先頭にあるデータの一部)を調べることによって取得されます(取得する必要があります)。

これはまさにmime_content_type_newとUNIXコマンドが実行していることなので、問題はありません。「より良い」方法が何を意味するのかわからない、あなたはそれを正しくやっている。

ブラウザの問題が原因で異なるMIMEタイプの結果が得られる場合は、許容可能な値の配列を作成し、in_array()メソッドで確認する必要があります。

特にセキュリティが大きな問題である場合は、そのようなMIMEタイプチェックをクライアント側のコードの手に委ねることはお勧めしません。クライアントはコードにアクセスできるので、だましやすくなります。

ただし、クライアント側とサーバー側の両方でチェックを行うことはできます。これにより、不正なアップロードによる帯域幅を節約できますが、悪意のあるユーザーからシステムを保護できます。

これは、JavascriptのFILEAPIとJavascriptを使用した画像の処理に関する優れたチュートリアルです。

http://www.html5rocks.com/en/tutorials/file/dndfiles/

乾杯。

于 2012-07-03T14:53:20.323 に答える
0

これは証明ソリューションではないかもしれませんが(新しい/現在のブラウザのみ)、新しいjavascript FILE APIを使用すると、ファイルをアップロードせずにMIME-TYPEを読み取ることができます。サーバー側の検証では、ファイルをアップロードする必要があります->そしてそれらを検証する必要があります。

于 2012-07-03T14:48:12.670 に答える