PHPを利用したスマートファイルタイプ検出の実現コード
ファイル拡張子とMIMEタイプを使って、通常はファイルタイプを厳しく制限したい場合、簡単に$uを使うことができます。FILES['myFile''''''type'はファイルのMIMEタイプを取得して、それが適法なタイプかどうかを検出する。ファイル名の最後の文字を取ってファイルの拡張子を取得することができますが、残念なことに、これらの方法は十分ではなく、ファイルの拡張子を簡単に変更してこの制限を回避することができます。また、MIMEタイプ情報はブラウザで送信されます。また、ほとんどのブラウザについては、すべてでなくても、ファイルの拡張子に応じてMIMEタイプ情報が与えられます。したがって、MIMEタイプは、拡張子のように簡単にだまされることができる。「マジックバイト」を使ってファイルタイプを決定する一番いい方法は、ファイルの最初の数バイトCをチェックすることで「魔バイト」と呼ばれる。マジックバイトは、本質的には、ファイルヘッドの異なる長さが2バイトから40バイトの間にあるか、またはファイルの末尾にある署名である。百種類以上のファイルがあります。その中のかなり多いファイルタイプはいくつかのファイルの署名と関連があります。ここでファイルの署名リストを見ることができます。サボる方法はfileinfoを使って拡張することです。PHP 5.3.0はデフォルトで有効になっています。もし有効にしていないなら、Windowsの下にあります。
extension=php_fileinfo.dll
linuxの下にあります。
extension=fileinfo.so
# ,
#mime_magic.magicfile=/usr/share/file/magic
windowsの下で正常に動作できない場合:参照してください。http://www.php.net/manual/en/fileinfo.installation.php#82570 file-5.03-bin.zipをダウンロードします。解凍されました。その中のshareディレクトリにはmagic.mgc、magicの2つのファイルがあります。それからMAGICというシステム環境変数を追加してmagicファイルを指します。D:\software\PHP\extres\misc\magic
function getFileMimeType($file) {
$buffer = file_get_contents($file);
$finfo = new finfo(FILEINFO_MIME_TYPE);
return $finfo->buffer($buffer);
}
$mime_type = getFileMimeType($file);
switch($mime_type) {
case "image/jpeg":
// your actions go here...
}
処理画像のアップロードを許可するつもりなら、内蔵のgetimagesize()関数を使って、ユーザーが実際に有効な画像ファイルをアップロードすることを確認します。ファイルが有効な画像ファイルでない場合、この関数はfalseを返します。
// file input name myfile
$tempFile = $_FILES['myFile']['tmp_name']; // path of the temp file created by PHP during upload
$imginfo_array = getimagesize($tempFile); // returns a false if not a valid image file
if ($imginfo_array !== false) {
$mime_type = $imginfo_array['mime'];
switch($mime_type) {
case "image/jpeg":
// your actions go here...
}
}
else {
echo "This is not a valid image file";
}
手動で「魔法のバイト」を読み込み、解釈します。もし何らかの理由でFileInfo拡張をインストールできないなら、ファイルの最初のバイトをマニュアルで確認し、既知の魔法と特定のファイルタイプに関連するバイトのファイルタイプを比較します。このプロセスは、いくつかのテストとエラーを肯定しています。まだ可能性がありますので、不法な魔法バイトが少数あります。合法的なファイルフォーマットに関連しています。しかし、これは不可能ではありません。数年前に、本物のmp 3ファイルだけをアップロードできるスクリプトファイルを作るように要求されました。そして、当時はFileinfoを使うことができませんでした。このようなマニュアルでしか確認できませんでした。mp 3ファイルの非フランス語バイトを解析するのに時間がかかりましたが、とても速くて、安定したアップロードスクリプトを得ました。この記事が終わる前に、私は警告したいです。include()を呼び出してアップロードされたファイルを含んでいないことを確認したいです。PHPコードは画像に巧みに隠れています。また、画像もあなたのファイルを通じて確認できます。このようなシナリオが実行されると、システムに破壊をもたらすだけです。訳本:http://designshack.co.uk/articles/php-articles/smart-file-type-detection-using-php/