PHP - 如何确保上传的文件是JPG、GIF或PNG格式?

5
在 PHP 中,我可以通过扩展名检查上传文件的正确类型,因此代码应如下所示:
if ((($_FILES["photo1"]["type"] == "image/gif")
|| ($_FILES["photo1"]["type"] == "image/jpeg")
|| ($_FILES["photo1"]["type"] == "image/png"))
&& ($_FILES["photo1"]["size"] < 500000)) //also limiting size

接下来,在我的代码中的下一步,我将准备一个文件以进一步处理。但是,如果有人在上传之前将text_file.doc或javascript_file.js更改为samplefile.jpg怎么办?

move_uploaded_file(($_FILES['photo1']['tmp_name']), "photos/1.jpg");
$source1 = imagecreatefromjpeg("../photos/source1.jpg");

随后用户会看到来自imagecreatefromjpeg步骤的错误:

Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: gd-jpeg: JPEG
library reports unrecoverable error: in...

如果文件不是图形文件且不显示错误,如何跳过处理部分?
3个回答

5
根据文件上传文档所述,$_FILES['userfile']['type']表示:

如果浏览器提供了此信息,则为文件的MIME类型。例如,"image/gif"就是一个例子。但是,PHP端不会检查此MIME类型,因此不要轻信它的值。

这意味着在PHP端不会对其进行检查,您应该使用mime_content_type 来确认其MIME类型。
或者,您可以使用getimagesize来实际检查已上传的文件是否具有图像大小,如果不存在,则不是图像。

那不正确!正如你所说,它基于浏览器的声明,但这并不总是正确的(你可以发送application/word+doc - 或其他任何东西)。因此,您可以将任何内容重命名为其他名称,并提供虚假的MIME类型,以使PHP相信任何内容。 - halfdan

3

我会使用getimagesize函数并检查可能出现的错误,类似这样:

try {
    $size = getimagesize("your_image_file");
    echo 'image!';
} catch (Exception $e) {
    echo 'no known image format!'; 
}

这个GD函数并不完美,但它可以处理几种图像文件格式。

有几种方法可以在PHP中省略警告。如果出现这样的错误,通常会发生。要么在代码中预期它(通常更可取,参见我的try...catch示例),要么根据您的需求配置您的环境(例如省略警告)。


我认为这不会正常工作。如果有人将PNG文件重命名为JPG扩展名,则getimagesize仍可返回正确的大小,但是imagecreatefromjpeg函数会报错,因为底层流不是JPEG格式的。 - Aleks G
海报上问:如果一个文件不是图形文件,如何跳过处理部分,而不是如何验证JPG是否真的是JPG。由于他还期望其他格式,所以他将不得不使用更有创意的方法来单独处理它们。 - Bjoern
在你的代码后面,我应该加上这行代码吗?if $size!=0 { //image processing } - Lucas
1
类似这样的情况。请记住,在这个阶段,您“仅仅”确定上传的文件只是一张图片 - 而不是它是什么类型的图片(也许exif-imagetype,http://de2.php.net/manual/en/function.exif-imagetype.php,更适合这项任务)。 imagecreatefromjpeg 最适合处理... 嗯,JPEG格式的图片。 - Bjoern
1
getimagesize() 函数会返回确切的文件和 MIME 类型,因此检查 if (filename has .jpg) && (detected mime type = image/jpeg) { ... } else { hey something goofy here! } 是微不足道的。 - Marc B
啊,是的,这样比我最初选择的方法更好,如何检查它! - Bjoern

1

首先,您应该编辑php.ini以禁用警告和错误消息的输出,以便这些用户不会看到错误。至少对于生产系统,这是推荐的。

然后,您应该能够检查函数的返回值。根据http://de.php.net/manual/en/function.imagecreatefromjpeg.php,如果无法打开您提供的文件,则应返回false。

此外,通过异常处理(请参见http://www.php.net/manual/en/language.exceptions.php),您可以捕获和处理像上面发布的错误消息和警告。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接