我正在尝试将上传的文件名从一堆不可读的文件转换为有组织的,人类可读的文件结构。我想知道我是否需要采取任何额外的安全措施来保护这类系统。
为了简要概述,当前系统上传文件,生成随机文件名,并且只允许通过下载脚本访问文件(我不需要直接将文件提供给浏览器)。
简而言之,我想实现一个WebDav系统,并认为最简单的解决方案是将上传的文件存储为原始名称(分成不同的文件夹)。
谢谢
编辑:为了澄清,我想尽可能保留文件名,但我显然需要至少首先清理文件名。我考虑过chmod包含文件夹以防止执行(位于web目录之外的文件夹)。 另外,我不在考虑。
答案 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/
。
...
- 不是将文件存储在
/home/example/uploaded/
,而是将所有相关元数据存储在数据库记录中(同时注意prevent SQL injection vulnerabilities)并使用random filename进行实际的文件系统存储。
这有三件事:
如果您需要一个真正的实现来引用,这里有两个来自我正在开发的CMS: