检查图像在PHP中是否有效的最佳和最快方法是什么?

chu*_*byk 17 php image

检查图像在PHP中是否有效的最佳和最快方法是什么?我需要它能够检查GIF,JPG以及PNG图像.

Fel*_*Eve 33

exif_imagetype是一个更好的解决方案.

这种方法比使用getimagesize更快.引用php.net "返回值与getimagesize()在索引2中返回的值相同,但exif_imagetype()要快得多."

if(exif_imagetype('path/to/image.jpg')) {
    // your image is valid
}
Run Code Online (Sandbox Code Playgroud)

更新:

在阅读getimagesize可能不可靠后,我试图找到更多关于哪些文件类型可以给出误报的信息,但是找不到更多信息,所以进行了简短的测试(使用exif_imagetype):

PowerPoint-survey-results.pptx - N
LRMonoPhase4.wav               - N
TestWordDoc.doc                - N
drop.avi                       - N
test.dll                       - N
raw_data_sample.sav            - N
text.txt                       - N
Excel-survey-results.xlsx      - N
pdf-test.pdf                   - N
simplepie-1.5.zip              - N
Word-survey-results.docx       - N
centaur_1.mpg                  - N
Test.svg                       - N
multipage_tif_example.tif      - Y
200.gif                        - Y
Test.png                       - Y
test.jpg                       - Y
Run Code Online (Sandbox Code Playgroud)

我意识到这并不详尽,但至少表明,对于常见的文件类型,结果是预期的.

  • 当然,这仅在启用EXIF扩展时有效.在我的情况下,情况并非如此,我无法控制这个:( (2认同)

Mar*_*hls 7

根据PHP文档的建议:

"不要使用getimagesize()来检查给定文件是否是有效图像.请使用专门构建的解决方案,例如Fileinfo扩展."

这是一个例子:

$finfo = finfo_open(FILEINFO_MIME_TYPE);
$type = finfo_file($finfo, "test.jpg");

if (isset($type) && in_array($type, array("image/png", "image/jpeg", "image/gif"))) {
    echo 'This is an image file';
} else {
    echo 'Not an image :(';
}
Run Code Online (Sandbox Code Playgroud)

  • 这种方法是不安全的,可以被利用。攻击者可以欺骗MIME类型,并上传扩展名为.php的文件 (4认同)

Bla*_*iev 4

我猜getimagesize

list($width, $height, $type, $attr) = getimagesize("path/to/image.jpg");

if (isset($type) && in_array($type, array(
    IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_GIF))) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

  • 阅读文档:不要使用 getimagesize() 来检查给定文件是否是有效图像。http://php.net/manual/en/function.getimagesize.php (10认同)