控制器中的白名单易受攻击的参数

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] 属性。