誰かがファイルタイプを偽造しているかどうかを確認するにはどうすればよいですか? (PHP)
-
06-07-2019 - |
質問
私は、ユーザーがドキュメントや写真をウェブサーバーに保存し、後で保存および取得できるようにするプログラムを作成しています。ユーザーがサーバーにファイルをアップロードすると、PHPは拡張子に基づいてどのファイルタイプであるかを教えてくれます。ただし、ユーザーがzipファイルの名前をsomezipfile.pngに変更して保存し、サーバーにzipファイルを保持できるのではないかと考えています。アップロードされたファイルを開いて「チェック」する合理的な方法はありますか?それが本当に上記のファイルタイプかどうかを確認しますか?
解決
マジック番号。バイナリファイルの最初の数バイトを読み取ることができれば、どのようなファイルであるかを知ることができます。
他のヒント
FileInfo PHPのPECL拡張機能をチェックしてください。 MIMEマジックルックアップ。
の並べ替え。ほとんどのファイルタイプには、拡張子に依存する必要がないように、それらをマークするために予約されたいくつかのバイトがあります。サイト http://wotsit.org は、特定のタイプについてこれを見つけるための優れたリソースです。
Unixシステムを使用している場合、ファイルコマンドは拡張子に依存しないため、バイトチェックコードを記述したくない場合は、このコマンドを使用することができます。
PNGの場合( http://www.w3.org/TR/PNG- Rationale.html )
PNGファイルの最初の8バイトには、常に次の値が含まれます。
(10進数)137 80 78 71 13 10 26 10
(16進数)89 50 4e 47 0d 0a 1a 0a
(ASCII C表記)\ 211 P N G \ r \ n \ 032 \ n
画像のみを扱う場合、getimagesize()は有効な画像と偽の画像を区別する必要があります。
$ php -r 'var_dump(getimagesize("b&n.jpg"));'
array(7) {
[0]=>
int(200)
[1]=>
int(200)
[2]=>
int(2)
[3]=>
string(24) "width="200" height="200""
["bits"]=>
int(8)
["channels"]=>
int(3)
["mime"]=>
string(10) "image/jpeg"
}
$ php -r 'var_dump(getimagesize("/etc/passwd"));'
bool(false)
getimagesizeのfalse値は画像ではありません。
多くのファイルタイプには" マジックナンバー"があります。ファイルの先頭でそれらを識別するために、ファイルの先頭から数バイトを読み取り、それらを既知のマジックナンバーのリストと比較できます。
UNIXシステムでは、 'file'コマンドからの出力をキャプチャすると、適切な情報が提供されます。
PHPでこれを迅速に行う方法に関する正確な回答については、次の質問をご覧ください: phpでファイルのmime-typeを見つけるにはどうすればよいですか
補足として、同様の問題が発生し、独自の型チェックを行う必要がありました。アプリケーションへのフロントエンドインターフェイスはフラッシュで行われました。ファイルはフラッシュを介してphpスクリプトに渡されていました。 phpを使用してMIMEタイプのチェックを試みたとき、フラッシュから送信されたため、常に返されるタイプはapplication / octetstreamでした。
マジックナンバー型のパラダイムを実装する必要がありました。ファイルの先頭にあるいくつかの定義パターンとともに、ファイルタイプを保持するxmlファイルを作成しました。ファイルがサーバーに到達したら、xmlファイルとパターンマッチングを行い、ファイルを承認または拒否しました。期待していた実際のパフォーマンスの低下にも気付きませんでした。
これは、フロントエンドとしてFlashを使用し、アップロードされたファイルをタイプチェックしようとする場合の補足です。
ファイルの種類を識別するだけでなく、他のファイルが埋め込まれているファイルや追加されているファイルに注意することもできます。残念ながら、単に「マジックナンバー」を使用するよりも、ファイルの内容を詳細に分析する必要があります。
たとえば、 http://quantumrook.wordpress.com/2007/06/06/hide-a-rar-file-in-a-jpg-file/ (この特定の種類のデータ隠蔽は簡単に回避できます実際の画像データを新しいファイルにロードして再保存します。他のデータはさらに困難になります。