web-dev-qa-db-ja.com

PHPファイルが画像かどうかを確認

受信したファイルがPHPの画像であることを確認する方法はありますか?

拡張機能のテストは、scriptをアップロードし、その拡張機能を必要なものに変更できるため、あまり安全ではありません。

私もgetimagesizeを使用しようとしましたが、その特定の問題により適したものがあるかもしれません。

42
sf89

MIMEタイプを取得するネイティブな方法:

PHP <5.3 use mime_content_type()
PHP> = 5.3の場合 finfo_open() または mime_content_type() を使用

MimeTypeを取得する代替手段は exif_imagetypegetimagesize ですが、これらは適切なライブラリがインストールされていることに依存しています。さらに、 magic.mime で指定されたリスト全体ではなく、イメージのmimetypeを返す可能性があります。

mime_content_typeはPHP 4.3から入手でき、FileInfo拡張機能の一部です(PHP 5.3手動で有効にします。詳細については、 here )を参照してください。

システムで利用可能なものを気にしたくない場合は、4つの関数すべてを、利用可能なものに関数呼び出しを委任するプロキシメソッドにラップするだけです。

function getMimeType($filename)
{
    $mimetype = false;
    if(function_exists('finfo_open')) {
        // open with FileInfo
    } elseif(function_exists('getimagesize')) {
        // open with Gd
    } elseif(function_exists('exif_imagetype')) {
       // open with EXIF
    } elseif(function_exists('mime_content_type')) {
       $mimetype = mime_content_type($filename);
    }
    return $mimetype;
}
21
Dead Man

getimagesize()は、ファイルが画像かどうかを判断する最も明確な方法です。

if(@is_array(getimagesize($mediapath))){
    $image = true;
} else {
    $image = false;
}

サンプルであるためgetimagesize()出力:

Array (
[0] => 800
[1] => 450
[2] => 2
[3] => width="800" height="450"
[bits] => 8
[channels] => 3
[mime] => image/jpeg)
68

ファイル拡張子とgetimagesize関数を使用して、アップロードされたファイルの形式が正しいかどうかを検出するのはエントリレベルのチェックであり、真の拡張子とイメージヘッダーの一部のバイトを含むファイルをアップロードするだけでバイパスできます。

安全性と安全性を確保するために、アップロードした画像をサムネイル/サイズ変更(元の画像サイズでも)して、アップロードした画像の代わりにこのバージョンを保存できます。また、アップロードされたファイルコンテンツを取得し、<?phpなどの特殊文字を検索して、ファイルがイメージかどうかを見つけることもできます。

10
Sheen