【问题标题】:Correct way to validate file upload in PHP - including user changing file extension?在 PHP 中验证文件上传的正确方法 - 包括用户更改文件扩展名?
【发布时间】:2014-04-04 01:15:16
【问题描述】:

目前我在允许上传之前检查 PHP 中图像的所有元素。但是当涉及到文件扩展名之类的事情时,我有点担心。

我使用以下方法只允许上传某种类型的文件:

$allowed_ext = array("jpeg", "jpg", "gif", "png");

$tmp_ext = explode(".", $_FILES["file"]["name"]);
$ext = strtolower(end($tmp_ext));

if ((($_FILES["file"]["type"] == "image/jpeg")
    || ($_FILES["file"]["type"] == "image/jpg")
    || ($_FILES["file"]["type"] == "image/gif")
    || ($_FILES["file"]["type"] == "image/png"))
&& in_array($ext, $allowed_ext)) {
    //Continue
} else {
    //Don't allow
}

但这会阻止所有形式的用户自己更改文件扩展名吗?例如如果用户将恶意文件的文件扩展名更改为 .jpeg 或 .png - 这会阻止它吗?

我找不到任何说明这一点的帖子,因此感谢您的帮助!

【问题讨论】:

    标签: php image file validation upload


    【解决方案1】:

    简短的回答,不,您不能依赖 MIME 类型。类型和文件扩展名均由客户端提供。

    看起来您可以使用 getimagesize() 来验证图像,归功于此线程:PHP: $_FILES["file"]["type"] is useless

    【讨论】:

    • 您将如何处理这些图像?在浏览器中显示它们?
    • 任何体面的浏览器都应该防止图像中的恶意代码,所以我认为您不必担心。如果您真的担心,您可以使用 getimagesize() 的组合并了解使用 ClamAV 扩展程序/程序来扫描文件以查找恶意代码。不过没有什么是完美的。
    【解决方案2】:
    1. 获取文件扩展名并将其与文件类型匹配,如果它们不匹配:失败。
    2. 使用扩展名/MIME 类型指定的文件格式从 GD 库中调用适当的 imagecreatefrom*() 函数。如果它不是由扩展/MIME 类型指定的类型的图像,则该函数将返回false

    【讨论】:

      猜你喜欢
      • 2017-03-12
      • 2014-11-06
      • 2011-05-13
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-29
      • 1970-01-01
      相关资源
      最近更新 更多