ユーザーがドキュメントや写真を Web サーバーに保存し、後で保存して取得できるようにするプログラムを作成しています。ユーザーが私のサーバーにファイルをアップロードすると、PHP は拡張子に基づいてファイルの種類を教えてくれます。ただし、ユーザーがzipファイルの名前をsomezipfile.pngに変更して保存し、サーバーにzipファイルを保持できるのではないかと心配しています。アップロードされたファイルを開いて「チェック」して、それが本当に上記のファイルタイプであるかどうかを確認する合理的な方法はありますか?
9 に答える
マジックナンバー。バイナリファイルの最初の数バイトを読み取ることができれば、それがどのような種類のファイルであるかを知ることができます。
PHP用のFileInfoPECL拡張機能を確認してください。これにより、MIMEマジックルックアップを実行できます。
ある種。ほとんどのファイルタイプには、拡張子に依存する必要がないように、それらをマークするために予約されたバイトがあります。サイトhttp://wotsit.orgは、特定のタイプについてこれを見つけるための優れたリソースです。
UNIXシステムを使用している場合、fileコマンドは拡張子に依存しないと思います。したがって、バイトチェックコードを記述したくない場合は、拡張子をシェルアウトできます。
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 PNG \ 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 値は画像ではありません。
ちなみに、私は自分で型チェックをしなければならないという同様の問題に遭遇しました。私のアプリケーションへのフロントエンドインターフェイスはフラッシュで行われました。ファイルはフラッシュを介してphpスクリプトに渡されていました。phpを使用してMIMEタイプチェックを行おうとしたとき、フラッシュからのものであるため、常に返されるタイプはapplication/octetstreamでした。
マジックナンバータイプのパラダイムを実装する必要がありました。ファイルの先頭にあるいくつかの定義パターンとともにファイルタイプを保持するxmlファイルを作成しただけです。ファイルがサーバーに到達したら、xmlファイルとパターンマッチングを行い、ファイルを承認または拒否しました。予想していた実際のパフォーマンスの低下にも気づきませんでした。
これは、フロントエンドとしてフラッシュを使用していて、アップロードされたファイルをタイプチェックしようとしている人への補足です。
ファイルタイプを識別するだけでなく、他のファイルが埋め込まれている、または追加されているファイルに注意することもできます。残念ながら、これには単に「マジックナンバー」を使用するよりも、ファイルの内容をより詳細に分析する必要があります。
たとえば、 http: //quantumrook.wordpress.com/2007/06/06/hide-a-rar-file-in-a-jpg-file/(この特定のタイプのデータの非表示は、ロードして実際の画像データを新しいファイルに再保存する..他のデータはより困難になります。)
UNIXシステムでは、「file」コマンドからの出力をキャプチャすると、適切な情報が得られるはずです。
PHP でこれをすばやく行う方法に関する正確な回答については、次の質問を参照してください: How do I find the mime-type of a file with php?