我遇到一个问题,即潜在攻击者可以通过我的某种控制器方法访问可能敏感的信息,例如网络配置文件
public ActionResult GetPdfContent(string fileCode)
{
try
{
var relativePath = "~/files/content/" + fileCode;
if (!User.Identity.IsAuthenticated)
{
return RedirectToAction("Login", "Account");
}
if (System.IO.File.Exists(Server.MapPath(relativePath)))
{
return File("~/files/content/" + fileCode, "application/pdf", Server.UrlEncode(fileCode));
}
else
{
return View("ErrorNotExistsView");
}
}
}
作为建议,文件代码应该以白名单列出。
是否可以像添加所有白名单内容的列表一样简单,如果参数未包含在列表中,则返回错误?
List<string> lstWhitelistedContent = new List<string>() { "code1", "code2", "code3"};
if (!lstWhitelistedContent.Contains(fileCode))
{
return View("ErrorNotExistsView");
}
答案 0 :(得分:2)
另一种方法是将目录而不是文件列表列入白名单,显然你的/files/content
目录似乎已经是一个很好的候选者了。
此外,根据您的方法名称判断,它应该只提供.pdf
个文件,因此您可以通过文件扩展名添加其他限制。
请改为尝试:
[Authorize]
public ActionResult GetPdfContent(string fileCode)
{
// this will remove path traversal attempts like '..'
var fileName = Path.GetFileName(fileCode);
// this will get you the file extension
var fileExtension = Path.GetExtension(fileName).ToLowerInvariant();
if (fileExtension != ".pdf")
return View("ErrorNotExistsView");
return File("~/files/content/" + fileName, "application/pdf", Server.UrlEncode(fileName));
}
}
此外,我冒昧地删除了方法中的授权检查,并改为放置[Authorize]
属性。