【问题标题】:Upload any file in PHP with security安全上传PHP中的任何文件
【发布时间】:2019-03-12 21:32:47
【问题描述】:

我想建立上传中心,我允许上传所有文件(甚至 .php、.bat、....) 但是我必须做一些无法运行的事情,例如,用户在 'site.com/20190520/52.php' 地址上传 'index.php' 然后我想要如果每个人都去 'site.com/20190520/52 .php' PHP代码并不能运行其实大家只能下载不能运行。

另一个例子: 我在“https://cdn.discordapp.com/attachments/433604751326838794/555138662237732894/a.html”中上传了“a.html”,如果你去这里它没有运行 我想这样做。

提示:我认为我们应该更改文件头,但如何更改?

【问题讨论】:

  • 将文件保存在私有目录中。如果有人试图访问site.com/20190520/52.php,他们只需执行readfile(PRIVATE_DIR . '/20190520/52.php');

标签: php file security upload header


【解决方案1】:

按照建议,您可以将其存储在私有目录中,最好是在服务器的 WEB_ROOT 之外的某个地方。使用这种方法需要考虑一些事项。

  1. 确保为该目录正确设置了文件系统权限。
  2. 在处理文件请求时,site.com/20190520/52.php 确保防止目录遍历。即确保攻击者不能做类似site.com/20190520/../../../../../../etc/passwd

  3. 的事情
  4. 除非每个人都可以访问每个文件,否则请务必考虑您计划如何验证/授权请求。

您也可以考虑从系统级别解决此问题。将文件存储在私有目录中,并在将提供文件的子域上设置单独的 Web 服务器(vhost 等)。它可以配置为不执行任何文件。您的网络服务器(nginx、apache 等)将决定您如何配置它。

另一个想法可能是考虑利用 CDN 服务。这些服务将向您公开一个 API,因此您的用户上传文件,您在服务器上获取它并将其发送到 CDN。根据您正在寻找的性能,这可能是最简单和最快的选项,并且可以很好地扩展。

【讨论】:

    猜你喜欢
    • 2013-10-18
    • 1970-01-01
    • 2012-04-14
    • 2011-04-27
    • 2011-06-24
    • 1970-01-01
    • 2013-02-14
    • 2012-06-18
    • 1970-01-01
    相关资源
    最近更新 更多