【问题标题】:Secure uploading file [closed]安全上传文件[关闭]
【发布时间】:2014-02-04 18:54:26
【问题描述】:

我的 php 项目中有文件上传系统。

我在上传时所做的:

1) 检查文件扩展名和文件 mime 类型。

2)如果扩展名和mime类型是允许的类型,我将文件保存在public_html目录之外,然后,我给用户机会,下载文件:

     if (file_exists($file_path)) {
            header('Content-Description: File Transfer');
            header('Content-Type: some mime type');
            header('Content-Disposition: attachment; filename=somefilename');
            header('Content-Transfer-Encoding: binary');
            header('Expires: 0');
            header('Cache-Control: must-revalidate');
            header('Pragma: public');
            header('Content-Length: ' . filesize($file_path));
            readfile($file_path);
     }

问题:上传文件的这个步骤,是否安全?如果没有,还有什么可以提高上传文件的安全性?

谢谢。

【问题讨论】:

    标签: php security file-upload


    【解决方案1】:
    • 检查 MIME 类型根本没有帮助,因为可以精心制作该信息。
    • 这取决于您检查文件扩展名的方式以及您对该信息的处理方式。尝试使用“白名单”作为文件扩展名而不是“黑名单”。
    • 将它移到 public_html 之外是个好主意,也可以尝试重命名文件并添加扩展名。
    • 对压缩文件要格外小心,最终可能会处理一些 zipbomb 或类似的东西。
    • 如果要对文件进行某种操作(例如调整图像大小),请小心处理该文件。请记住,您正在处理将与您的代码交互的用户输入,并且它可能被精心设计以利用您的代码(例如代码执行漏洞)。

    还可以尝试阅读this article,它会为您提供一些您以前可能不会遇到的有用信息。

    【讨论】:

    • +1 是的,您可以将所有文件重命名为“安全”扩展名,例如 .txt,以防止它们在服务器上意外执行并将原始文件名存储在数据库中,或者更好地存储数据库中的实际二进制数据肯定会防止意外执行。您还可以通过不同的域 (download.example.com) 访问文件以供下载,这将防止针对您的站点的任何 XSS 攻击,因为任何 JavaScript 代码都将受到同源策略的保护。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 2012-10-03
    • 2013-10-18
    • 2011-10-16
    • 1970-01-01
    • 2012-04-14
    • 2018-03-28
    相关资源
    最近更新 更多