mvc输入验证最佳实践问题

时间:2011-04-06 02:07:32

标签: c# asp.net-mvc validation

所以我正在查看nerddinner源代码,并对输入处理有一些疑问。

以下是相关代码:

        [HttpPost]
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings",
        Justification = "Needs to take same parameter type as Controller.Redirect()")]
    public ActionResult LogOn(string userName, string password, bool rememberMe, string returnUrl) {

        if (!ValidateLogOn(userName, password)) {
            ViewData["rememberMe"] = rememberMe;
            return View();
        }
        .....
    }

    private bool ValidateLogOn(string userName, string password) {
        if (String.IsNullOrEmpty(userName)) {
            ModelState.AddModelError("username", "You must specify a username.");
        }
        if (String.IsNullOrEmpty(password)) {
            ModelState.AddModelError("password", "You must specify a password.");
        }
        if (!MembershipService.ValidateUser(userName, password)) {
            ModelState.AddModelError("_FORM", "The username or password provided is incorrect.");
        }

        return ModelState.IsValid;
    }

我的问题是,我在上述方法中没有看到任何真正的输入验证。是的,他们有一些空验证,但实际上输入似乎直接传递给会员服务。这有什么影响?我知道MVC 3似乎具有相当不错的默认XSS保护(即:如果检测到xss输入,它将抛出错误)。 sql注入怎么样?我想我问的是以下问题:

1)MembershipService.ValidateUser实际上做了什么? 2)那时是否有任何输入验证?或者它只是依靠查询参数来保护数据库? 3)输入验证的最佳实践是什么?我假设它将在入口处应用白名单,但我不会在此处看到。

1 个答案:

答案 0 :(得分:1)

1)MembershipService.ValidateUser调用microsofts default ASP.NET Membership Provider,并且根据该用户是否在商店中,它将验证用户名和密码。您可以override默认的MembershipService.ValidateUser方法并调用您自己的后端成员资格商店。

2)我认为它使用查询参数来阻止sql注入。

3)您可以在将查询参数发送给会员提供商进行验证之前对其进行验证。如果您想清洗数据。最好的方法是使用白名单,但您也可以在用户输入上设置最大长度,这样他们就无法发送太多信息。