受信したファイルがPHP
の画像であることを確認する方法はありますか?
拡張機能のテストは、script
をアップロードし、その拡張機能を必要なものに変更できるため、あまり安全ではありません。
私もgetimagesize
を使用しようとしましたが、その特定の問題により適したものがあるかもしれません。
MIMEタイプを取得するネイティブな方法:
PHP <5.3 use mime_content_type()
PHP> = 5.3の場合 finfo_open() または mime_content_type() を使用
MimeTypeを取得する代替手段は exif_imagetype と getimagesize ですが、これらは適切なライブラリがインストールされていることに依存しています。さらに、 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;
}
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)
ファイル拡張子とgetimagesize
関数を使用して、アップロードされたファイルの形式が正しいかどうかを検出するのはエントリレベルのチェックであり、真の拡張子とイメージヘッダーの一部のバイトを含むファイルをアップロードするだけでバイパスできます。
安全性と安全性を確保するために、アップロードした画像をサムネイル/サイズ変更(元の画像サイズでも)して、アップロードした画像の代わりにこのバージョンを保存できます。また、アップロードされたファイルコンテンツを取得し、<?php
などの特殊文字を検索して、ファイルがイメージかどうかを見つけることもできます。