【问题标题】:Considerations when retaining uploaded file's original filename保留上传文件的原始文件名时的注意事项
【发布时间】:2016-04-22 10:22:06
【问题描述】:

我正在尝试将我们上传的文件名从一堆不可读的文件转换为有组织且人类可读的文件结构。我想知道是否需要采取任何额外的安全措施来保护此类系统。

简要概述一下,当前系统上传文件,生成随机文件名,并且只允许通过下载脚本访问文件(我不需要将文件直接提供给浏览器)。

简而言之,我想实现一个 WebDav 系统,并且认为最简单的解决方案是使用原始名称存储上传的文件(分隔到不同的文件夹中)。

谢谢

编辑:澄清一下,我想尽可能地保留文件名,但显然我至少需要先清理文件名。我已经考虑对包含文件夹进行 chmod 以防止执行(位于 web 目录之外的文件夹)。 此外,我还没有考虑什么

【问题讨论】:

    标签: php security file-upload


    【解决方案1】:

    简而言之,我想实现一个 WebDav 系统,并且认为最简单的解决方案是使用原始名称存储上传的文件

    这是一个相当广泛的问题,但要简短回答:永远不要相信用户提供的数据。您必须始终进行服务器端验证和清理,否则您迟早会被黑客入侵。

    原始文件名是客户端发送的,所以它可以是任何东西。以下是一些关于我会尝试将您作为“原始”文件名发送给您的一些想法,因为我知道您是如此
    无忧无虑:../../../../etc/passwd../../config/db.php。随遇而安。享受:)

    编辑

    我应该提到我考虑过的事情——清理文件名

    净化后的文件名不再是original file name。但是,您可以在这里考虑一些方法来实现您的目标并保持安全。您可以验证/清理原始文件名,如果之后它仍然与来自用户的相同,您可以保留文件并保留原始名称。如果不是,那么您应该拒绝整个文件上传。在一天结束时,您将只拥有可以通过其他 API/接口以原始文件名访问的文件。

    编辑

    我考虑过对包含文件夹进行 chmod 以防止执行

    这是一个糟糕的安全性。您应该将文件保存在无法直接访问的文件夹中。

    【讨论】:

    • 我应该提到我考虑过的事情——清理文件名,chmod-ing 包含的文件夹
    • 净化后的文件名不是original file name。你问到保留原始(这意味着不变)名称,我解决了这个问题。
    • 您说的是存储在 Web 目录之外,对吗?如果没有,您会建议去哪里?
    • 是的,所以你不能直接请求文件。
    【解决方案2】:

    来自How to Securely Allow Users to Upload Files

    始终将上传的文件存储在文档根目录之外

    如果您的网站是example.com,并且当访问者在浏览器中访问该网站时,位于/home/example/public_html/index.php 的脚本被执行,那么您不应该将用户上传的文件存储在/home/example/public_html/ 或任何它的子目录。相反,一个好的候选人应该是/home/example/uploaded/

    ...

    这做了三件事:

    1. 它保证您的用户文件永远不会被执行作为脚本。无论他们喜欢与否,他们都可以获得只读访问权限。 (没有反向壳!)
    2. 它可以防止用户控制文件名,以防止安全关键文件被覆盖。
    3. 它允许您在不牺牲安全性的情况下保留尽可能多的有关每个文件的元数据。

    如果您需要一个真正的实现来参考,这里有两个来自我正在开发的 CMS:

    【讨论】:

      猜你喜欢
      • 2012-04-12
      • 1970-01-01
      • 2020-02-16
      • 2011-01-09
      • 2018-08-19
      • 1970-01-01
      • 1970-01-01
      • 2020-06-20
      • 1970-01-01
      相关资源
      最近更新 更多