C# ASP.NET MVC5文件下载安全最佳实践?
我们正在构建一个ASP.NET MVC5 web应用程序,其中包括提供文件下载服务 用户需要使用ASP.NET Identity framework登录 这些文件存储在数据库中(我们正在与一个遗留应用程序接口),每个文件都由一个标准的整数主键标识 我们计划提供以下文件: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 然后,控制器检查是否允许请求用户访问该文件(使用一些复杂的业务规则),以及是否成功地将该文件流式传输给用户 我一直在研究
http://www.example.com/getFile?fileId=5
我们的方法足够了吗?或者我们应该用另一种方法来做吗?如果是的话,请问推荐的方法是什么?我曾经创建过类似的方法 用户请求一个文件,我们验证用户是否可以访问该文件,然后将其流式传输到他们的浏览器。 但我们做的一件事是将文件存储在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继续包含文件名。。。并非所有浏览器都会使用该文件名。