首页 文章

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

提问于
浏览
3

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

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

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

我们计划如下提供文件:

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

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

我一直在研究最佳实践,但我正在努力寻找具体细节,因为我所阅读的大部分内容都涉及从物理路径读取文件的场景,因此建议在请求中混淆文件名 .

如果控制器将在每个请求上验证用户对文件的访问权限,我们可以对文件进行模糊处理's ID but I don' t .

Is our approach sufficient or should we be doing it another way, if so, what is the recommended way please?

2 回答

  • -1

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

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

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

    希望这可以帮助 .

相关问题