64

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

script拡張機能のテストは、をアップロードしてその拡張機能を好きなように変更できるため、私にはあまり安全に聞こえません。

私も使ってみましgetimagesizeたが、その特定の問題にもっと適したものがあるかもしれません。

4

3 に答える 3

87

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)
于 2013-03-14T11:38:19.453 に答える
32

MIMEtypeを取得するネイティブの方法:

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

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

PHP 4.3から利用可能でmime_content_typeあり、FileInfo拡張機能の一部です(PHP 5.3以降、デフォルトで有効になっています。ただし、手動で有効にする必要があるWindowsプラットフォームを除きます。詳細については、こちらを参照してください)。

システムで何が利用できるかを気にしたくない場合は、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;
}
于 2013-03-14T11:37:48.667 に答える
13

アップロードされたファイルが正しい形式であるかどうかを検出するためにファイル拡張子とgetimagesize機能を使用することは、エントリレベルのチェックであり、真の拡張子と画像ヘッダーの一部のバイトを含むが間違ったコンテンツのファイルをアップロードすることで簡単にバイパスできます。

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

于 2013-03-14T11:52:25.960 に答える