2011-04-06 5 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 입력을 검색하면 오류가 throw됩니다) 것으로 보인다. SQL 인젝션은 어때? 나는 다음과 같은 질문을하고 있다고 생각한다 :

1) MembershipService.ValidateUser는 실제로 무엇을 하는가?
2) 그 시점에서 입력 유효성 검사가 있습니까? 또는 데이터베이스를 보호하기 위해 쿼리 매개 변수에만 의존하고 있습니까?
3) 입력 유효성 검사에 가장 적합한 방법은 무엇입니까? 나는 그것이 입력 지점에서 적용된 화이트리스트가 될 것이라고 추측하고 있지만, 나는 여기에 따라 오는 것을 보지 못한다.

답변

1

1) MembershipService.ValidateUser는 default ASP.NET Membership Provider 마이크로 소프트를 호출하고 해당 사용자가 저장소에 있는지 여부에 따라 사용자 이름과 암호의 유효성을 검사합니다. override 기본 MembershipService.ValidateUser 메서드를 사용하고 자체 백엔드 멤버십 스토어에 전화 할 수 있습니다.

2) SQL 주입을 막기 위해 쿼리 매개 변수를 사용한다고 생각합니다.

3) 유효성을 검사하기 위해 회원 자격 공급자에게 보내기 전에 쿼리 매개 변수의 유효성을 검사 할 수 있습니다. 데이터를 씻으려는 경우. 가장 좋은 방법은 허용 목록을 사용하는 것이지만 사용자 입력에 최대 길이를 설정하여 너무 많은 정보를 보낼 수는 없습니다.