【问题标题】:How to restrict file upload using PHP?如何使用 PHP 限制文件上传?
【发布时间】:2011-10-15 00:34:21
【问题描述】:

我正在尝试使用 PHP 进行受限文件上传。

我用过

if (($_FILES["file"]["type"] == "application/dbase")
||($_FILES["file"]["type"] == "application/dbf")
||($_FILES["file"]["type"] == "application/x-dbase")
||($_FILES["file"]["type"] == "application/x-dbf")
||($_FILES["file"]["type"] == "zz-application/zz-winassoc-dbf"))

对于我来说,.dbf(即 Microsoft Visual FoxPro 表类型)文件不起作用。请向我建议我应该为 .dbf 的内容类型添加什么内容。

【问题讨论】:

标签: php


【解决方案1】:

当您上传该类型的文件时,请尝试检查传递给您的 MIME 类型。在代码中的某处插入一个临时的print $_FILES["file"]["type"];,然后上传文件以运行代码并查看它打印出来的内容!然后,您可以复制该类型并在您的 if 语句中使用它。

【讨论】:

  • 如果类型是“application-octet-stream”,如果浏览器无法识别实际文件类型,它会默认使用什么?如果 type 字段被故意欺骗怎么办?
  • 然后我会提交他使用文件类型作为验证上传的众多检查之一。
  • 我知道它不可靠,但我觉得仍然可以使用。用户上传和图像文件?它被类型检查发现了。如果用户上传了一张图片,但将其伪装成 application-octet-stream,那么其他检查就会发现它。
  • 如果用户上传了一个恶意软件并将其文件类型伪装成系统认为安全的东西怎么办?
  • 正如我之前提到的,类型检查并不是only检查。这将是任何数量的检查的一部分。上面,我的图像示例就是这样:一个示例。我们是否应该同意您发现 MIME 类型完全不可靠且无法使用,而我发现它可以一些使用它。
【解决方案2】:

定义内容类型取决于浏览器(或其他客户端应用程序),使其易于篡改且不可依赖。我的猜测是您的浏览器无法识别 .dbf 文件并默认为“application/octet-stream”。

【讨论】:

    【解决方案3】:

    您不能依赖文件上传的类型字段来实际确定其类型。首先,它可以被客户端欺骗。其次,客户端可能根本不知道文件类型实际上是什么,而只是报告“应用程序/八位字节流”。

    您必须自己确定上传的文件类型。幸运的是,PHP 提供了 fileinfo 扩展名,它可以帮助您确定文件的类型。

    基于 php.net 的代码示例:

    <?php
    $finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension
    echo finfo_file($finfo, $_FILES["file"]["tmp_name"]) . "\n";
    finfo_close($finfo);
    ?>
    

    http://www.php.net/manual/en/ref.fileinfo.php

    【讨论】:

      【解决方案4】:

      上传文件的浏览器可能不知道它是 application/dbf mime-time,并将其作为通用“application/octet-stream”发送。客户端/浏览器必须设置上传时知道的 mime-type,这可以由用户更改!

      因此 MIME 类型不可靠。如果您想确定它是正确的文件类型/格式,您必须检查上传的文件。

      【讨论】:

        【解决方案5】:

        这个问题还有另一种简单的方法,而不是检查 MIME 类型, 我们可以通过这个函数获取上传文件的文件扩展名。

        $filename=$_FILES["file"]["tmp_name"];   
         $ext = pathinfo($filename, PATHINFO_EXTENSION);
         $ext = strtolower($ext);
        
         if($ext=="png"||$ext=="gif"||$ext=="jpg"||$ext=="jpeg"||$ext=="pdf"
                ||$ext=="doc"||$ext=="docx"||$ext=="xls"
                ||$ext=="xlsx"||$ext=="xlsm"||$ext=="dbf")
            {
                // your code whatever you want to write;
        
             }
        

        在这里Blob-upload找到一个简单的blob上传和下载文件

        【讨论】:

          猜你喜欢
          • 2011-11-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-02
          • 2022-01-05
          • 1970-01-01
          • 1970-01-01
          • 2011-12-05
          相关资源
          最近更新 更多