php - 安全上传文件

标签 php security file-upload

我的 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);
     }

问题:这个上传文件的步骤安全不安全?如果没有,可以做些什么来提高上传文件的安全性?

谢谢。

最佳答案

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

另请尝试阅读 this article ,它会给你一些以前可能没有的有用信息。

关于php - 安全上传文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21560949/

相关文章:

php - 从上传的文件执行代码

php - 如何读取缓存的xml文件?

c++ - 判断IP是否被封

security - 此 SSO 实现安全吗?

jquery - 如何通过Ajax使用fileuploader保存图像

php - 如何在 Safari 中显示谷歌字体?

css - 如何在不引入 XSS 的情况下允许用户控制 CSS?

c# - 无需页面刷新的 Azure 上传 Blob

Django 测试模拟 ImageField 在测试后阻止上传或清理

php - SqliGestionCongeBundle :Default:add. html.twig 中不存在对象 "email"的方法 "Symfony\Component\Form\FormView"