3

我有这个问题很多年了,每次出现这个问题时都会进行研究,但始终找不到明确的答案。不知何故,强大的 Internet、MSDN、社区论坛对此要么保持沉默,要么含糊其辞。在数以千计的与发展有关的不确定性中,这是唯一一个仍然难以捉摸的。

直截了当:为了使用户能够在共享主机环境中上传和管理他们博客文章中使用的图像(和其他文件),我可以考虑 SQL Server 二进制数据类型(性能影响)或文件系统。要使用后者,需要为存储目录上的 IIS_IUSRS 角色设置必要的权限:创建/写入、读取和删除。我的问题 - 如果我这样做,安全隐患是什么?有人能以某种方式利用这一点,绕过 ASP.NET 请求管道并操纵文件夹内的文件,而不向相应的 ASP.NET 处理程序(检查权限、验证上传等)发出请求吗?

我开发了几个允许文件上传的系统,这一直困扰着我。现在,希望有人能够让我放心,并在理想情况下解释该过程背后的机制。


更新

查看最新答案后(非常感谢),问题的另一种表述:

客户端是否有可能以某种方式绕过请求管道并在允许它的目录中创建/删除文件(假设该人知道目录结构)?还是只有处理请求的代码才能做到?有什么潜在的利用吗?

4

2 回答 2

1
于 2012-11-01T06:26:04.370 回答
1

之前做过这件事,我会提出两个建议:

首先,不要将上传的文件存储在与您的应用程序代码相同的目录结构中(如果可能)。使其成为一个明确定义的外部位置,并明确锁定到仅运行应用程序的用户。这使得恶意上传更难注入您的应用程序,因为 Web 服务器或 ASP.NET 本身不知道如何访问文件(只有您的应用程序)。

如果绝对不可能这样做,请确保没有外部用户可以使用标准的 ASP.NET 授权访问存储文件夹,并且只允许您的应用程序用户写入此文件夹,除此之外别无其他。

二、上传的文件不要以原始名称和文件扩展名存储;保持元数据分开。只需将文件视为原始二进制数据块。这有几个原因。首先,它可以防止在服务器上无意中执行文件,无论是直接访问文件系统的人、Web 服务器还是 ASP.NET。其次,它使攻击者更难利用恶意上传,因为他们永远无法猜测服务器上文件的名称或路径。

于 2012-11-01T06:59:47.517 回答