控制器中的白名单易受攻击的参数
White listing vulnerable parameters within Controller
我遇到一个问题,潜在的攻击者可以通过我的控制器方法之一访问潜在的敏感信息,例如 Web 配置文件
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");
}
另一种方法是将目录而不是文件列表列入白名单,显然您的 /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]
属性。
我遇到一个问题,潜在的攻击者可以通过我的控制器方法之一访问潜在的敏感信息,例如 Web 配置文件
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");
}
另一种方法是将目录而不是文件列表列入白名单,显然您的 /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]
属性。