【发布时间】:2010-12-07 13:23:21
【问题描述】:
如果文件上传到服务器,有没有办法使用 PHP 来确保它实际上是一张图片,而不仅仅是一个扩展名为 .jpg 或 .gif 的文件?
【问题讨论】:
标签: php image security validation
如果文件上传到服务器,有没有办法使用 PHP 来确保它实际上是一张图片,而不仅仅是一个扩展名为 .jpg 或 .gif 的文件?
【问题讨论】:
标签: php image security validation
使用(部分)GD 库。
array getimagesize ( string $filename [, array &$imageinfo ] )
如果没有图像,则数组的第一个元素将为 0。 PHP: getimagesize
如果您没有安装 GD(大多数时候您会安装),您可以将文件头读取为Shane mentioned。
编辑: 实际上,正如 Neal 在 cmets 中指出的那样,GD 库甚至不需要使用此功能。所以使用它。
【讨论】:
exif_imagetype更好,更快。
检查文件是否为图像的最佳方法
function is_image($path)
{
$a = getimagesize($path);
$image_type = $a[2];
if(in_array($image_type , array(IMAGETYPE_GIF , IMAGETYPE_JPEG ,IMAGETYPE_PNG , IMAGETYPE_BMP)))
{
return true;
}
return false;
}
更多:http://www.binarytides.com/php-check-if-file-is-an-image/
【讨论】:
getimagesize() 来检查给定文件是否为有效图像。
最有效的方法是查看文件的开始字节并测试“幻数”文件说明符。 Here is a list of magic numbers.
【讨论】:
标题检查不足以检查图像文件的有效性。
PHP 文档明确表示您不应使用getimagesize 来检查给定文件是否为有效图像。见https://www.php.net/manual/en/function.getimagesize.php
我使用以下函数来验证图像文件:
/**
* Returns TRUE if $path is a valid Image File
*
* @param string $path
* @return bool
*/
public static function isImage(string $path)
{
if (!is_readable($path)) {
return false;
}
// see https://www.php.net/manual/en/function.exif-imagetype.php for Constants
// adjust this array to your needs
$supported = [IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG];
$type = exif_imagetype($path);
// $type can be valid, but not "supported"
if (!in_array($type, $supported)) {
return false;
}
// check the image content, header check is not enough
$image = false;
switch ($type) {
case IMAGETYPE_GIF:
$image = @imagecreatefromgif($path);
break;
case IMAGETYPE_PNG:
$image = @imagecreatefrompng($path);
break;
case IMAGETYPE_JPEG:
$image = @imagecreatefromjpeg($path);
break;
}
return (!!$image);
}
【讨论】:
郑重声明:现在在 2013 年+,我们可以:
最大。兼容性(如果您没有 GD 库)。
使用始终可用的mime-content-type ((PHP 4 >= 4.3.0, PHP 5))
$type = mime_content_type($filename);
if (strstr($type, 'image/'))
{
echo 'is image';
}
【讨论】: