有没有办法确保收到的文件是PHP
中的图片?
测试扩展程序对我来说听起来不太安全,因为您可以上传script
并将其扩展名更改为您想要的任何内容。
我也尝试使用getimagesize
,但可能会有更适合该特定问题的内容。
答案 0 :(得分:62)
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)
答案 1 :(得分:21)
获取mimetype的本地方式:
对于PHP< 5.3使用mime_content_type()
对于PHP> = 5.3,请使用finfo_open()或mime_content_type()
获取MimeType的替代方法是exif_imagetype和getimagesize,但这些依赖于安装了适当的库。此外,他们可能只返回图像mimetypes,而不是magic.mime中给出的整个列表。
虽然{4}可以从PHP 4.3获得并且是FileInfo扩展的一部分(默认情况下从PHP 5.3开始启用,但Windows平台除外,必须手动启用它,有关详细信息,请参阅{{3} })。
如果您不想打扰系统中可用的内容,只需将所有四个函数包装到一个代理方法中,该方法将函数调用委托给任何可用的函数,例如。
mime_content_type
答案 2 :(得分:10)
使用文件扩展名和getimagesize
函数来检测上传的文件是否具有正确的格式只是入门级检查,它可以通过上传具有真正扩展名的文件和图像标题的某个字节但错误的内容来绕过。
为了安全和安全,您可以对上传的图片进行缩略图/调整大小(即使使用原始图像大小),也可以保存此版本而不是上传的版本。
还可以获取上传的文件内容并搜索特殊字符(如<?php
)以查找文件是否为图像。