Итак, я просматривал исходный код 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) Какова наилучшая практика для проверки входных данных? Я предполагаю, что это будут Белые списки, применяемые в точке входа, но я не вижу, что здесь последовало.