【问题标题】:$_files['uploaded_img']['type'] vs getimagesize()$_files['uploaded_img']['type'] vs getimagesize()
【发布时间】:2012-08-29 00:35:42
【问题描述】:

我想检查上传的文件类型,请告诉我在哪里可靠,在什么情况下可以获得有关文件类型的更准确信息?在这个:

$_files['uploaded_file']['type']

或在此:

$imgType = getimagesize($_files['uploaded_file']['tmp_name']);
$imgType['mime'];

?

【问题讨论】:

    标签: php


    【解决方案1】:

    $_FILES[...]['type']从不可靠,它是用户提供的任意值。 getimagesizeexif_imagetypefinfo 是检查您所拥有物品的首选方式。另见Security threats with uploads

    【讨论】:

      【解决方案2】:

      实际上,您可能应该使用图片附带的元数据 ($_files['uploaded_file']['type']),但在上传之前可能会被篡改。

      如果您只是追求尺寸,请使用它,因为它比使用getimagesize 实际测量图像要快。但是,如果您需要文件类型信息,最好检查文件“所说”之外的内容,因为通过幼稚的检查很容易潜入可执行文件。

      【讨论】:

        【解决方案3】:

        我相信 getimagesize

        因为任何人都可以编辑上传的文件类型使用任何 HTTP/HTTPS 标头,例如在 firefox 中篡改数据插件

        【讨论】:

          【解决方案4】:

          $_FILES['uploaded_file']['type'] 是用户输入 - 它是客户端定义的任意字符串。因此,使用任何东西都是不安全的。

          getimagesize() 是一种更安全的方法,但它并不能完全保护您。

          您还需要:

          • 使用完全由您自己设计的名称将文件存储在本地服务器上。依赖任何用户输入来生成本地文件系统文件名是不安全的。
          • 使用 GD 将像素数据从源文件复制到目标文件。 getimagesize() 只查看与文件关联的元数据,不查看文件数据。可以将恶意代码隐藏在看起来像图像的东西中。重新采样图像后,请确保已从服务器中删除上传的文件。
          • 确保文件存储在本地文件系统中,具有所需的最低权限和限制性所有者/组。

          【讨论】:

            【解决方案5】:

            永远不要相信$_FILES["image"]["type"]。它接受从浏览器发送的任何内容,因此对于图像类型不要相信它。所以请使用getimagesize(),或者如果您想更安全,请使用finfo_open

            来源:http://php.net/manual/en/reserved.variables.files.php

            【讨论】:

              【解决方案6】:

              使用getimagesize() 将为您提供更一致的mime 信息,因为它使用它的环境mime-type 文件定义(GD 模块mime 数据库)。

              如果您只依赖$_FILES['uploaded_file']['type'],那么它将包含客户端计算机(即浏览器)上定义的 mime-type,或者浏览器甚至可能不会发送 mime-type。

              一个非常愚蠢的例子是检查if($_FILES['uploaded_file']['type'] == 'image/jpeg'),当使用将发送'image/pjpeg' mime-type 的 IE6/7 时可能会失败

              这两种方法的替代方法是使用mime_content_type(),但它已被弃用为 PECL 模块,因此从 PHP 5.3.0 开始,FileInfo 函数应该与任何文件类型更一致 - 尽管我没有测试过了。

              有关 mime 类型的更多概述,请查看这篇 SO 文章:How do I find the mime-type of a file with php?

              【讨论】:

                猜你喜欢
                • 2012-04-05
                • 1970-01-01
                • 2011-12-11
                • 1970-01-01
                • 2023-03-30
                • 2014-11-25
                • 2019-10-09
                • 2014-09-11
                • 1970-01-01
                相关资源
                最近更新 更多