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

C# ASP.NET MVC5文件下载安全最佳实践?,c#,asp.net,asp.net-mvc,security,C#,Asp.net,Asp.net Mvc,Security,我们正在构建一个ASP.NET MVC5 web应用程序,其中包括提供文件下载服务 用户需要使用ASP.NET Identity framework登录 这些文件存储在数据库中(我们正在与一个遗留应用程序接口),每个文件都由一个标准的整数主键标识 我们计划提供以下文件: 用户使用其ID请求文件,例如http://www.example.com/getFile?fileId=5 然后,控制器检查是否允许请求用户访问该文件(使用一些复杂的业务规则),以及是否成功地将该文件流式传输给用户 我一直在研究

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

用户需要使用ASP.NET Identity framework登录

这些文件存储在数据库中(我们正在与一个遗留应用程序接口),每个文件都由一个标准的整数主键标识

我们计划提供以下文件:

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

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

  • 我一直在研究最佳实践,但很难找到细节,因为我所读的大部分内容都涉及从物理路径读取文件的场景,因此建议在请求中混淆文件名

    我们可以混淆文件的ID,但如果控制器在每次请求时验证用户对文件的访问,我看不出有多大意义


    我们的方法足够了吗?或者我们应该用另一种方法来做吗?如果是的话,请问推荐的方法是什么?

    我曾经创建过类似的方法

    用户请求一个文件,我们验证用户是否可以访问该文件,然后将其流式传输到他们的浏览器。 但我们做的一件事是将文件存储在web app文件夹之外。这确保了文件不会意外进入谷歌,而且更安全,因为恶意用户无法使用文件的完整路径直接下载文件

    您可以很容易地混淆文件名。以下面的代码为例:

     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”中,放置用户将看到的文件。这可以是任何东西


    希望这能有所帮助。

    你的方法已经足够了。如果控制器中的授权规则充分保护了文件,那么这就是您所需要的全部


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

    -1使用
    byte[]
    可能导致内存碎片。“文件名”的“模糊处理”是不相关的,因为数据存储在数据库中,所以没有文件名。URL继续包含文件名。。。并非所有浏览器都会使用该文件名。