ASP.NET MVC5文件下载安全性最佳实践?

时间:2015-06-03 09:01:56

标签: c# asp.net asp.net-mvc security

我们正在构建一个ASP.NET MVC5 Web应用程序,其中包括提供文件下载。

用户需要使用ASP.NET Identity框架登录。

文件存储在数据库中(我们与遗留应用程序连接),每个文件由标准整数主键标识。

我们计划按如下方式提供文件:

  1. 用户使用其ID请求文件,例如。 http://www.example.com/getFile?fileId=5

  2. 然后,控制器会检查是否允许请求用户访问该文件(使用一些复杂的业务规则),如果成功将文件流式传输给用户。

  3. 我一直在研究最佳实践,但我很难找到具体内容,因为我所阅读的大部分内容都涉及从物理路径中读取文件的情况,因此建议在请求中混淆文件名

    我们可以模糊文件的ID,但是如果控制器在每个请求中验证用户对文件的访问权限,我就不会注意到这一点

    我们的方法是否足够,或者我们应该采取另一种方式,如果是这样,建议的方式是什么?

2 个答案:

答案 0 :(得分:1)

你的方法已经足够了。如果您的控制器中的授权规则足以保护文件,那么这应该是您需要的全部内容。

正在发生的唯一信息泄漏是在用于请求文件的URL中使用数据库中文件的主键。如果您的应用程序的另一部分容易受到SQL注入攻击,并且攻击者利用您的URL中的ID构造SQL注入攻击来获取具有特定ID的文件,则可能会创建漏洞。然而,这在实践中是否存在风险取决于您的应用程序是否也容易受到SQL注入攻击,并且大多数攻击者可能会以任何方式猜测或暴力破坏ID,因此即使您很容易被屏蔽,也可能没有什么实际好处。 SQL注入攻击 - 在这种情况下更好的关注点是确保你没有。

答案 1 :(得分:-1)

我曾经创造过类似的东西。

用户要求提供文件,我们验证用户是否可以访问该文件,然后将其流式传输到浏览器。 但我们做的一件事是将文件存储在Web应用程序文件夹之外。这确保了文件无法偶然进入Google,并且更安全,因为恶意用户无法使用文件的完整路径直接下载文件。

您可以非常轻松地对文件名进行模糊处理。看一下这段代码,例如:

 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"中,您放置了用户将看到的文件。这可以是任何事情。

希望这有帮助。