保留上传文件原始文件名的注意事项

时间:2016-04-22 10:22:07

标签: php security file-upload

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

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

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

谢谢

编辑:为了澄清,我想尽可能保留文件名,但我显然需要至少首先清理文件名。我考虑过chmod包含文件夹以防止执行(位于web目录之外的文件夹)。 另外,我不在考虑

2 个答案:

答案 0 :(得分:1)

  

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

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

原始文件名由客户端发送,因此它可以是任何内容。以下是我试图将您发送给您的一些想法#34;原创"文件名知道你是这样的 无忧无虑:../../../../etc/passwd../../config/db.php。处理即将到来。享受:)

修改

  

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

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

修改

  

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

这是安全性差的问题。您应该将文件保存在不能直接访问的文件夹中。

答案 1 :(得分:0)

来自How to Securely Allow Users to Upload Files

  

始终在文档根目录外存储上载的文件

     

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

...

  

这有三件事:

  1. 它保证您的用户文件永远不会作为脚本执行。无论喜欢与否,他们都可以获得只读访问权限。 (没有反向炮弹!)
  2. 它阻止用户控制文件名,以防止覆盖安全关键文件。
  3. 它允许您在不牺牲安全性的情况下保留尽可能多的关于每个文件的元数据。
  4. 如果您需要一个真正的实现来引用,这里有两个来自我正在开发的CMS: