ファイル-PHPのfinfo::bufferをどのようにスプーフィングできますか?
アップロードされたファイルを処理する場合、 $_FILES['foo']['type']
はまったく信頼できません。 OS Xで拡張子を変更すると、「タイプ」が自動的に変更されることがわかりました。
代わりに検討してください:
$fileInfo = new \finfo(FILEINFO_MIME);
$mimeType = $fileInfo->buffer(file_get_contents($_FILES['foo']['tmp_name']));
$mimeType = explode(';', $mimeType);
ここで、PHPスクリプトの名前を.jpgに変更してアップロードすると(OS X 10.10の場合) $_FILES['foo']['type'] = image/jpeg および$mimeType = text/x-php
。
ファイルタイプは簡単に変更できますが、PHPのfinfo :: bufferをスプーフィングするにはどうすればよいですか? PHPが$_FILES['foo']['type']
とfinfo(FILEINFO_MIME)をチェックしたものの違いは何ですか?
答え :
解決策:
PHPは Finfoは、 magic データベースを使用します。これは、ファイルタイプの識別特性の単なるコレクションです。つまり、すべてのJPEGファイルには特徴的なヘッダーがあり、すべてのZIPファイルは特定の方法で開始され、このファイルタイプにはこれらの先頭バイト数があり、そのファイルタイプにはこれらの種類の末尾バイトなどがあります。実際にスプーフィングするのは困難です。特定の種類の有効なファイルを作成したいが、決して不可能ではありません。 $_FILES
タイプでは何もチェックしません。ファイルをアップロードするとき、送信側のブラウザは、ファイルの種類と見なされるメタデータを送信しています。 $_FILES ['file'] ['type'] は、ブラウザによってアップロードされたこの値を反映しているだけです。もちろん、誰でもこれを自由に偽装できます。
答え :
解決策:
一方、fileinfo拡張機能は、magic_openライブラリに依存しています。私の記憶が正しければ、magic_openはファイルヘッダーを含むファイルの複数の属性をチェックして、mimetypeを判別します。 phpをhtmlファイルに埋め込んでみてください。ファイルヘッダーは $_FILES は、ファイルを含むmimeパーツのContent-Typeヘッダーからタイプを取得します。その部分は、ファイルを送信するもの、通常はファイル拡張子に基づいてタイプを推測するブラウザによって作成されます。
<!DOCTYPE html>であるため、
text/html
がmimeタイプであると判断されると思います。
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。