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)输入验证的最佳实践是什么?我假设它将在入境点应用白名单,但我没有看到这里遵循。
1) MembershipService。ValidateUser调用微软默认的ASP。NET会员资格提供程序,并根据该用户是否在存储中,它将验证用户名和密码。您可以覆盖默认的MembershipService。ValidateUser方法,并调用自己的后端成员库。
2)我认为它使用查询参数来防止sql注入。
3)在将查询参数发送给成员资格提供者进行验证之前,您可以验证查询参数。如果您希望清洗数据。最好的方法是使用白名单,但你也可以设置用户输入的最大长度,这样他们就不会发送太多的信息。