2013-06-09 5 views
2

ASP.NET MVC는 데이터 주석 기능을 제공합니다. 따라서 필요한 장식자를 mdoels에 지정하면 유효성 검사가 처리됩니다.ASP.NET MVC의 데이터 주석

그렇다면 컨트롤러에서 ModelState.IsValid()을 계속 점검해야하는 이유는 무엇입니까? 분명히 모든 데이터가 뷰에서 유효 할 때만 컨트롤러에서 작업이 호출됩니다.

사용자 입력을 다시 확인 하시겠습니까?

어떻게 작동합니까?

답변

4

웹 보안의 첫 번째 규칙은 "결코 클라이언트를 신뢰하지 않는다"입니다. MVC가 기본적으로 제공하는 클라이언트 측 유효성 검사가 있다고해서 그것이 무언가가 지나갈 수 없다는 것을 의미하지는 않습니다.

예를 들어 사용자가 자바 스크립트를 사용 중지하거나 빠른 사용자를 끌어 들여서 사용자의 양식을 무시하고 직접 데이터를 보내려는 부적절한 사용자가있을 수 있습니다.

[필수] 속성은 두 가지 작업을 수행합니다. 첫째, 클라이언트 쪽 유효성 검사가 설정되어 있으면 유효성 검사를 설정합니다. 이 경우 양식이 유효하지 않은 경우 양식이 제출되지 않습니다. 또한 서버 측 유효성 검사 (ModelState에 IsValid 플래그를 설정하는 것입니다.)

JavaScript를 사용하지 않거나 수동으로 데이터를 전송하려고하면 마지막 방어선으로 서버 측 검사가 필요합니다.

+0

나는 게리가 너를 대답하는 것 같아.하지만이게 내가 찾고 있던거야. 감사. – ckv

2

컨트롤러는 여전히 유효하지 않은 입력이 있어도 호출됩니다. 아마도 Java Script 유효성 검사를 통해 요청을 실행하지 못하게 할 수 있습니다. 사용자가 Java 스크립트를 비활성화 할 수 있기 때문에 서버를 계속 확인해야합니다.

+0

클라이언트 쪽에서 작성된 명시 적 자바 스크립트 유효성 검사가 없습니다. [필수] 특성이있는 모델의 입력 요소를 장식했습니다. – ckv

+0

@ckv asp.net mvc가 자동으로이 작업을 수행합니다. –

2

모델에서 데코레이터를 사용하면 두 가지 유효성 검사 유형을 사용할 수 있습니다. 첫 번째는 클라이언트 측 유효성 검사입니다. 이것은 모델에 'name'이라는 속성이 있고 .cshtml 파일에서 @ Html.TextBoxFor (m => m.name)와 같은 것을 사용하면이 템플릿이 클라이언트 사이드 자바 스크립트 페이지. 당신이 자바 스크립트를 직접 작성하지 않습니다, 그것은 asp.net mvc에 의해 귀하의 페이지에 추가되고 있습니다. 페이지의 소스 코드를 볼 수 있습니다.

좋은 점은 양식이 게시되기 전에 클라이언트 측 확인이 수행되므로 사용자가 게시를 기다리고 유효성 검사 오류로 다시 돌아 오는 것입니다. 나쁜 점은 클라이언트 측 유효성 검사가 우회 될 수 있다는 것입니다. 사용자가 자바 스크립트를 사용할 수 없도록 설정하면 문제가 발생하지 않습니다. 또는 악의적 인 사용자가 양식을 작성하고 제출을 누르는 대신 게시 요청을 직접 수행 할 수 있으므로 게시가 클라이언트 측 유효성 검사없이 진행됩니다.

따라서 서버 측 유효성 검사의 두 번째 유형을 사용할 필요가 있습니다. ModelState.IsValid()를 수행하면 서버 측 유효성 검사를 수행 할 때이며, 유효성 검사의 기초로 데코레이터를 사용합니다. 여기에이 문장이 없으면 서버 측 유효성 검사를 수행하지 않고 클라이언트 측 유효성 검사에만 의존하게됩니다 (방금 언급 한 바대로 회피 될 수있는 나쁜 생각입니다). 내 경험에 비추어 볼 때 언제나 게시물 요청에이 방법을 사용하는 것이 좋습니다.

+0

감사합니다. – ckv

+1

일부 데이터 유효성 검사 속성에는 클라이언트 측 해당 항목이 없으며 작업이 호출 될 때까지 검사되지 않습니다. 필수 항목 중 하나가 필요하지 않으며 사용자가 직접 모델 상태를 수행 할 수 있습니다 에서의 조작 뿐만 아니라.종종 유효성 검사 속성을 수행하지 않고 동작에서 요청의 유효성을 검사하고 모델 상태에 오류를 추가 한 다음 통과시켜 Model.IsValid가 처리하도록합니다. –

관련 문제