要点为了让用户能够上传和管理博客帖子中使用的图片(和其他文件),在共享托管环境中,我可以考虑SQL Server二进制数据类型(性能影响),或文件系统。要使用后者,需要为存储目录中的IIS_IUSRS角色设置必要的权限:create / write,read和delete。我的问题 - 如果我这样做,有什么安全隐患?有人可以以某种方式利用这一点,绕过ASP.NET请求管道并操纵文件夹中的文件而不向相应的ASP.NET处理程序(检查权限,验证上传等)发出请求吗?
我开发了几个允许文件上传的系统,这一直困扰着我。现在,希望有人能够放心,理想地解释这个过程背后的机制。
更新
查看最新答案后(非常感谢),问题的另一个表述:
客户端是否可能以某种方式绕过请求管道并在允许它的目录中创建/删除文件(假设此人知道目录结构)?或者只有处理请求的代码可以执行此操作?任何潜在的漏洞?
答案 0 :(得分:1)
主要问题是能够使用照片文件在此目录中上传脚本,aspx页面并运行它。
以下是一个案例:I've been hacked. Evil aspx file uploaded called AspxSpy. They're still trying. Help me trap them‼
解决方案是在允许上传文件的目录上添加这个额外的web.config
文件,而不允许运行任何aspx页面。另外,如果他们有机会进行重命名,请仔细检查以仅允许您允许的扩展名,并且不允许在文件名上更改该扩展名。
<configuration>
<system.web>
<authorization>
<deny users="*" />
</authorization>
</system.web>
</configuration>
同样在允许上传文件的目录上,不允许运行任何其他脚本,如简单的asp,php或exe,或任何其他脚本。
您的所有网页都有权在服务器上运行和操作许多内容。你现在给出的是write
对某些目录的能力,也是通过使用一些aspx页面。 asp.net现在还有一个额外的权限,可以在照片文件夹中写入文件。另请注意,您的asp.net页面有此控件,而不是用户。你在那里使用你的代码可以写在这个目录上,所以必须小心那里仔细检查你写的地方,不允许任何其他目录,不允许用户操纵可以写入的目录。
所以这是薄弱环节。能够上传更多可以控制服务器的脚本,至少是该池的asp.net用户可以访问的部分。
答案 1 :(得分:1)
之前完成此操作后,我会提出两条建议:
首先,不要将上传的文件存储在与应用程序代码相同的目录结构中(如果可能)。使其成为定义明确的外部位置,并仅显式锁定应用程序正在运行的用户。这使得恶意上传更难以注入到您的应用程序中,因为Web服务器或ASP.NET本身都不知道如何访问该文件(仅限您的应用程序)。
如果绝对不可能这样做,请务必确保没有外部用户可以使用标准ASP.NET授权访问存储文件夹,并且只允许应用程序用户写入此文件夹,而不允许其他任何内容。
其次,不要将上传的文件与原始名称和文件扩展名一起存储;保持元数据分开。只需将文件视为原始二进制blob数据。这有好几个原因。首先,它可以防止在服务器上无意中执行文件,无论是直接访问文件系统的人,Web服务器还是ASP.NET。其次,它使攻击者更难以利用恶意上传,因为他们永远无法猜测服务器上文件的名称或路径。