在其中一个项目中,我看到了以下代码。
string FileName = Request.QueryString["filename"];
System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
response.ClearContent();
response.Clear();
response.ContentType = "application/octet-stream";
response.AddHeader("Content-Disposition", "attachment; filename=" + FileName + ";");
response.TransmitFile(Server.MapPath("~/" + FileName));
response.Flush();
response.End();
用于从服务器下载文件。现在,如果有人手动更改查询字符串中的文件名(如web.config),那么它也会下载配置文件。
因此,请分享您的知识如何根据文件扩展名限制下载。
答案 0 :(得分:3)
这通常在IIS中完成。但是,如果您想以编程方式进行操作:
string[] forbiddenExtensions = new string[] {".config", ".abc", ".xml" };
FileInfo fi = new FileInfo(FileName);
if (forbiddenExtensions.Contains(fi.Extension))
{
//throw some error or something...
}
答案 1 :(得分:0)
首先,您必须问自己是否要编写代码以让用户下载文件系统中存在的文件。 Web服务器本身可以很好地处理文件下载并阻止访问不应该共享的文件。
如果您确定要执行此操作,例如因为您希望在每次下载之前运行一些代码,那么您应该查看creating a handler。然后,Web服务器仍将首先确定权限和诸如此类,以防止恶意用户下载敏感文件,并且在允许时,您的代码将在下载之前运行。
话虽如此,您并不想从您的网络根目录下载文件。而是创建一个专用目录,例如" Downloads",并托管您的文件以便从那里下载。然后使用filename = Path.GetFileName(filename)
阻止用户在该目录之外导航(使用..
和/或\
)。