我创建了这个 HTTP 处理程序来更新本地 SQL Express 数据库中的信息。
我意识到用户可以使用相对 URI 路径“/../../file.zip”作为查询字符串,并且能够在受限区域之外下载文件。
该站点尚未上线,因此现在不是安全问题,但我真的很想阻止这样的事情。
我添加了一个简单的 string.replace 行,从输入查询中删除任何“..”。
我还应该在这里做些什么来确保这一点?
public void ProcessRequest(HttpContext context)
{
string filesPath = "C:/Downloads/";
string fileName = context.Request.QueryString["filename"];
fileName = fileName.Replace("'", "''").Replace("..", "").Replace("/", "").Replace("\\", "");
if (!string.IsNullOrEmpty(fileName) && File.Exists(filesPath + fileName))
{
context.Response.ContentType = "application/octet-stream";
context.Response.AddHeader("Content-Disposition", string.Format("attachment; filename=\"{0}\"", fileName));
context.Response.WriteFile(filesPath + fileName);
//Do work to update SQL database here
}
else
{
context.Response.ContentType = "text/plain";
context.Response.Write(filesPath + fileName + " Invalid filename");
}
}