将文件上传到公共 www 文件夹之外的文件夹是一种好的做法吗?

将文件上传到公共 www 文件夹之外的文件夹是一种好的做法吗?

我有一个网站,用户可以在其中上传文件。我不希望任何人都可以访问这些文件。

我看到有些人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,这些类型的托管文件存储解决方案现在非常便宜,并且可以为你解决所有麻烦。

相关内容