ASP.. NET MVC5文件下载安全最佳实践
本文关键字:最佳 安全 文件下载 NET MVC5 ASP | 更新日期: 2023-09-27 17:53:15
我们正在构建一个ASP。. NET MVC5 web应用程序,包括服务文件下载。
要求用户使用ASP登录。. NET身份框架。
文件存储在数据库中(我们正在与遗留应用程序接口),每个文件由标准整数主键标识。
我们计划按如下方式提供文件:
-
用户使用文件ID请求文件。
http://www.example.com/getFile?fileId=5
-
控制器然后检查是否允许请求用户访问该文件(使用一些复杂的业务规则),如果成功,则将文件流式传输给用户。
我一直在研究最佳实践,但很难找到具体细节,因为我读过的大多数内容都涉及从物理路径读取文件的场景,因此建议在请求中混淆文件名。
我们可以混淆文件的ID,但是如果控制器在每次请求时验证用户对文件的访问权限,我不认为有多大意义。
我们的方法是足够的,还是应该用另一种方法,如果是,请推荐什么方法?
您的方法完全足够了。如果您的控制器中的授权规则充分保护了文件,那么这应该是您所需要的。
唯一发生的信息泄漏是在用于请求文件的URL中使用了数据库中文件的主键。例如,如果应用程序的另一部分容易受到SQL注入攻击,并且攻击者利用URL中的ID构造SQL注入攻击以获取具有特定ID的文件,则可能会产生漏洞。然而,这在实践中是否存在风险取决于您的应用程序是否也容易受到SQL注入攻击,大多数攻击者可能会以任何方式猜测或暴力破解id,因此即使您容易受到SQL注入攻击,掩盖这些id也可能没有什么实际好处-在这种情况下,更好的关注点是简单地确保您没有。
我曾经创建过类似的东西。
用户请求文件,我们验证用户是否可以访问该文件,然后将其流式传输到他们的浏览器。我们做的一件事是,将文件存储在web应用程序文件夹之外。这确保了文件不会意外进入谷歌,也更安全,因为恶意用户不能使用文件的完整路径直接下载文件。
可以很容易地混淆文件名。看一下下面的代码,例如:
public FileResult Download()
{
byte[] fileBytes = System.IO.File.ReadAllBytes(@"c:'folder'myfile.ext");
string fileName = "myfile.ext";
return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
}
在变量"filename"中,放置用户将要看到的文件。可以是任何值