2011-04-06 59 views
0

所以我正在浏览nerddinner源代码,并对输入处理有一些疑问。mvc输入验证最佳实践问题

这里是有问题的代码:

 [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

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

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

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