PHP检查文件是否是图像
有没有办法确保收到的文件是在PHP
的图像?
扩展testing听起来不太安全,因为您可以上传script
并将其扩展名更改为任何您想要的。
我也尝试过使用getimagesize
,但是可能会有更适合这个问题的东西。
原生的方式来获取mimetype:
对于PHP <5.3使用mime_content_type()
对于PHP> 5.3,使用finfo_fopen()
获取MimeType的替代方法是exif_imagetype和getimagesize ,但这些依赖于安装了相应的库。 此外,他们可能会返回图像mimetypes,而不是magic.mime给出的整个列表。
当mime_content_type
从PHP5.3中移除时,它在该版本下工作正常。 E_STRICT
甚至不会提出关于它被弃用的通知。 如果你不想打扰系统中可用的东西,只需将所有四个函数包装到一个代理方法中,该代理方法将函数调用委托给任何可用的方法,例如
function getMimeType($filename) { $mimetype = false; if(function_exists('finfo_fopen')) { // 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
函数来检测上传的文件是否具有正确的格式只是入门级的检查,它可以简单地通过上传一个真正的扩展名和一个图像标题的字节,但错误的内容的文件绕过。
为了安全和安全,您可以缩略图/resize(即使是原始图像大小)上传的图片,并保存此版本,而不是上传的图片。 也有可能获得上传的文件内容,并寻找像<?php
特殊字符来查找该文件是否是图像。