所以我正在查看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)输入验证的最佳实践是什么?我假设它将在入口处应用白名单,但我不会在此处看到。
答案 0 :(得分:1)
1)MembershipService.ValidateUser调用microsofts default ASP.NET Membership Provider,并且根据该用户是否在商店中,它将验证用户名和密码。您可以override默认的MembershipService.ValidateUser方法并调用您自己的后端成员资格商店。
2)我认为它使用查询参数来阻止sql注入。
3)您可以在将查询参数发送给会员提供商进行验证之前对其进行验证。如果您想清洗数据。最好的方法是使用白名单,但您也可以在用户输入上设置最大长度,这样他们就无法发送太多信息。