我有一个网站,用户可以在其中上传文件。我不希望任何人都可以访问这些文件。
我看到有些人my_secret_folder
在目录的同一级创建一个文件夹(例如)www
。然后,他们使用以下命令上传文件(使用 PHP 脚本):
$destination = $_SERVER['DOCUMENT_ROOT'] . "/../my_secret_folder/" . $filename;
$destination
上传文件的完整路径在哪里。
然后,只有 PHP 脚本(来自 www 文件夹内)才被允许访问该文件。将文件上传到公共 www 文件夹之外的文件夹是一种好的做法吗?
答案1
是的,这是个好习惯。将其放置在 webroot 之外意味着文件不会因为 web 服务器的简单配置错误而被公开,从而增加了另一道防线 - 而且实施成本基本为零。
答案2
假设这是一个 apache 服务器,您是否考虑过对目录施加限制?
<Directory '/var/www/html/uploads'>
Options -Indexes
<Limit GET>
Require user admin
</Limit>
</Directory>
如果有人试图浏览目录,则不要显示文件列表,并将 HTML GET 限制为以管理员身份登录的人。
答案3
@Voo 在评论中已经暗示了这一点,但这一点非常重要,所以我认为应该将其移至答案框。
$destination = $_SERVER['DOCUMENT_ROOT']."/../my_secret_folder/".$filename
这是一个很好的做法,如果并且仅当,网络用户无法控制$filename
。否则,这是一个路径遍历漏洞。
考虑一下如果客户端提出特殊请求会发生什么情况$filename
。../www/index.php
您刚刚允许上传器覆盖了您的 Web 应用程序的代码。
抵制通过将诸如/
和 之类的值列入黑名单来解决此问题的诱惑..
:有很多方法可以解决这个问题,上面的链接列出了一些。此问题的规范解决方案是 (a) 自己选择文件名或 (b) 有一个明确的允许字符白名单。
答案4
我认为这是不是这是一种很好的做法。@Heinzi 指出的安全风险确实存在,但即使你在安全方面做得正确,你仍然会在服务器上存储一堆 [可能很重要的] 用户文件。理想情况下,服务器应该是临时的。存储文件的解决方案比让它们随意放在服务器上要好得多。即使你正在自动备份(是吗?),你对它们的设置可能远没有理想中那么强大。
我建议你例如研究一下 AWS S3 或 Google Cloud Storage,这些类型的托管文件存储解决方案现在非常便宜,并且可以为你解决所有麻烦。