我们有一个允许用户上传文件的网站。现在,如果我允许用户上传所有文件扩展名而不限制它们,这安全吗?我只限制文件大小不超过 1GB。请给出您的建议。我们使用 amazon s3 来存储文件。
答案1
允许用户不受限制地做任何事情都是不安全的。
答案2
您绝不应允许用户上传稍后可执行的文件。例如,如果您的服务器安装了 PHP,而用户上传了众多基于 PHP 的 Web 漏洞利用工具包之一(例如 C99 shell 变体),并且稍后能够让服务器执行它(通过访问文件链接),那么他们将完全或接近完全控制您的网站/服务器。
您不仅需要担心 PHP。任何底层 Web 服务器能够或可能执行的文件类型都应被禁止或以阻止执行的方式接收。
即使您过滤掉 .php 或 .py 等文件扩展名,服务器在访问文件时仍会尝试执行该文件,这仍然存在风险。攻击者常用的策略是将允许的文件扩展名(例如 .jpg)附加到文件名(例如,这样您就有了c99.php.jpg
),并且根据服务器配置,服务器仍可能会将其作为 PHP 执行。如果您运行的是类 Unix 操作系统,那么一个好的步骤是明确将上传的文件标记为不可执行。
答案3
不要允许用户做超出他们需要做的事情。在这种情况下,您没有说明他们上传文件的原因 - 这将在一定程度上决定您应该对文件施加哪些限制。(例如,如果您有一个处理文档的网站,请不要让您的用户上传应用程序(.exe),限制为一组可接受的文档 mime 类型)。
我认为更重要的考虑是上传后如何处理它们。例如,如果脚本要显示为文本(例如 GitHub),那么上传脚本可能完全没问题,但如果用户可以访问文件并在服务器上执行它,那就不行了。同样,上传到 S3,您需要确保您的用户无法直接访问他们的文件,否则很容易有人上传恶意文件并使用您的 S3 帐户来提供它。
如果用户无法执行文件、无法直接访问文件、也无法将其发送给其他人(即,他们只能存储文件并且必须登录才能检索),则需要的限制就较少。