白名单列出了控制器内易受攻击

时间:2015-11-11 10:15:13

标签: c# asp.net-mvc security penetration-testing

我遇到一个问题,即潜在攻击者可以通过我的某种控制器方法访问可能敏感的信息,例如网络配置文件

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");
}

1 个答案:

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