MVC输入验证最佳实践问题

本文关键字:问题 最佳 输入 验证 MVC | 更新日期: 2023-09-27 17:48:59

所以我看了一下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)输入验证的最佳实践是什么?我假设它将在入境点应用白名单,但我没有看到这里遵循。

MVC输入验证最佳实践问题

1) MembershipService。ValidateUser调用微软默认的ASP。NET会员资格提供程序,并根据该用户是否在存储中,它将验证用户名和密码。您可以覆盖默认的MembershipService。ValidateUser方法,并调用自己的后端成员库。

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

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