문제

웹 양식 응용 프로그램에 사용자 입력 유효성 검사를 어디에 두십니까?

  1. 보기 : JavaScript 클라이언트 측
  2. 컨트롤러 : 서버 측 언어 (C#...)
  3. 모델 : 데이터베이스 (저장 절차 또는 종속성)

각 레벨에 필요한 검증이 있다고 생각합니다.

  1. 사용자가 제정신 값을 입력 했습니까?
    • 날짜는 실제 날짜이고 숫자는 실제 숫자입니다 ...
  2. 모든 수표를 1로 수행합니다. 다시 악성 공격에 대한 검사 (예 : XSS 또는 SQL 주입)
    • 1에서 수행 한 수표는 주로 사용자가 실수 할 때 서버 왕복을 피하는 것입니다.
    • 그들이 JavaScript의 클라이언트 측에서 이루어지기 때문에, 당신은 그들이 실행되었다고 믿을 수 없습니다. 이 값을 다시 검증하면 악의적 인 공격이 중단됩니다.
  3. 의존성이 충족 되었습니까 (예 : 사용자가 유효한 질문에 주석을 추가 했습니까)
    • 좋은 인터페이스는 이것을 위반하기가 매우 어렵습니다. 여기에 무언가가 잡히면 무언가가 매우 잘못되었습니다.

에서 영감을 받다 이 응답]

도움이 되었습니까?

해결책

모든 계층을 확인하지만 사용하는 검증 트릭을 기록하고 싶습니다.

데이터베이스 계층에서 검증 된 경우 모델의 적절한 제약 조건은 자동 데이터 무결성 검증을 제공합니다.

이것은 대부분의 웹 프로그래머에서 잃어버린 것으로 보이는 예술입니다.

다른 팁

모델의 유효성 검사, 선택적으로 자동화 된 UI의 자동 루틴을 모델에서 힌트를 가져 와서 사용자 경험을 향상시킵니다.

자동화 된 루틴을 통해 사용자 인터페이스에 모델 당 유효성 검사 코드가 없어야합니다. ROR (Validates_Presence_of : username과 같은 메소드가있는 방법이있는 유효성 검사 메소드 라이브러리가있는 경우 컨트롤러 또는보기가이를 읽고 동등한 JavaScript (또는 편리한) 메소드를 적용 할 수 있어야합니다.

즉, UI에서 전체 유효성 검사 라이브러리를 복제하거나 기존하는 사람을 사용하는 경우 적어도 매핑을 제공해야합니다. 그러나 일단 완료되면 모델 외부에 검증 논리를 작성할 필요가 없습니다.

모든 계층에서 검증을 수행 할 수 있습니다.

웹 양식 (모든 문자열, 적절한 유형 등으로 캐스팅)에서 입력을 검증하는 것은 웹 서비스 또는 XML 파일 등의 입력을 검증하는 것과 다릅니다. 각각 고유 한 특수 사례가 있습니다. 물론 Validator 도우미 클래스를 만들어 검증을 외부화하고 뷰로 공유 할 수 있습니다.

그런 다음 DAO 계층 유효성 검사를 받았습니다. 모델에 충분한 데이터가 지속될 수 있습니다 (널 제한 조건 등을 충족시키지 않도록) 등이 있습니다. 데이터베이스에서 확인 제약 조건을 가질 수도 있습니다 ( 'N', 'A', 'S', 'D') 등).

이건 재미 있네. 가장 오랫동안 DAL (데이터 액세스 계층)을 고려하는 바로 모델에서 모든 검증을 수행했습니다. 내 모델은 일반적으로 추상화 및 낮은 레벨 API를 제공하는 DAL과 함께 테이블 데이터 게이트웨이 다음에 패턴을 맞추고 있습니다.

TDG는 다음과 같은 비즈니스 로직 및 유효성 검사를 구현합니다.

  1. 사용자 이름이 비어 있습니다
  2. 사용자 이름> 30 문자입니다
  3. 레코드가 존재하지 않으면 반환 오류

내 응용 프로그램이 복잡 해짐에 따라 JavaScript를 사용하여 클라이언트 측에서 많은 검증이 수행 될 수 있음을 깨닫기 시작했습니다. 그래서 나는 대부분의 유효성 검사 로직을 JS로 리팩토링하고 모델을 정리했습니다.

그런 다음 서버 측 유효성 검사 (필터링/탈출이 아닌 다른 것으로 간주)는 서버에서도 클라이언트 측만 케이크를 착빙 할 때만 수행해야한다는 것을 깨달았습니다.

따라서 검증 논리가 다시 실현되었을 때 입력 검증/어설 션과 비즈니스 규칙/논리 사이에 뚜렷한 차이가 있었을 것입니다.

기본적으로 응용 프로그램의 클라이언트 측 (JS 사용)에서 수행 할 수 있다면이를 입력 유효성 검사라고 생각합니다 ... 모델에서 수행 해야하는 경우 (이 레코드가 이미 존재합니까?) 비즈니스 로직. 혼란스러운 것은 둘 다 데이터 모델의 무결성을 보호한다는 것입니다.

사용자 이름의 길이를 '검증하지 않으면 사람들이 단일 문자 사용자 이름을 만들지 못하게하는 것은 무엇입니까?

나는 여전히 그 논리를 다음에 두어야 할 곳을 완전히 결정하지 않았다. 나는 그것이 당신이 더 많은 얇은 컨트롤러, 무거운 모델 또는 Visa-versa를 선호하는 것에 달려 있다고 생각한다.

제 경우에는 컨트롤러가 훨씬 더 많은 응용 프로그램 중심 인 경향이있는 반면, 모델은 신중하게 제작되면 모델은 종종 내부적으로 "다른"프로젝트를 재사용 할 수 있으므로 모델의 가벼운 무게와 컨트롤러를 더 무거운쪽에 유지하는 것이 좋습니다.

어떤 방향 으로든 힘이 당신을 이끌어내는 것은 실제로 개인적인 의견, 요구 사항, 경험 등입니다 ...

흥미로운 주제 :)

확인 ~ 해야 하다 컨트롤러에서 수행하십시오 - 안전과 응답을 보장하는 유일한 곳입니다.

확인 ~해야 한다 보기에서 끝나십시오 - 그것은 접촉 지점이며 최고의 UE를 제공하고 서버를 추가로 저장합니다.

확인 ~ 할 것이다 모델에서 수행하지만 특정 핵심 수준의 검사에 대해서만 수행하십시오. 데이터베이스는 항상 적절한 제약 조건을 반영해야하지만 실제 검증을 위해이 정보를 얻는 것은 비효율적이거나 항상 데이터베이스가 간단한 제약으로 유효한 입력을 결정할 수 없습니다.

모든 유효성 검사는 적어도 한 번 발생해야하며, 이는 가치 개체 (DDD 의미에서 DTO와 혼동되지 않도록) 또는 엔티티 자체의 비즈니스 대상을 통해 중간 계층에 있어야합니다. 사용자 경험을 향상시키기 위해 클라이언트 측 유효성 검사가 발생할 수 있습니다. 클라이언트 측 유효성 검사를 수행하지 않는 경향이 있습니다. 한 번에 양식에 잘못된 모든 것을 노출시킬 수 있기 때문에, 단지 내 개인적인 취향 일뿐입니다. 이는 로직을 고정시킬 경우 데이터 무결성을 보장하기 위해 데이터베이스 검증이 발생할 수 있습니다. 가운데 계층 또는 뒤로 끝났습니다.

보기와 컨트롤러에서만 데이터베이스는 데이터 유형과 그 내용에 따라 그 중 일부를 시행하지만 오히려 오류를 잡지 않고는 그렇게 멀지 않습니다.

당신은 자신의 질문에 거의 대답했지만, 알아야 할 중요한 것은 당신이 견해를 신뢰할 수 없다는 것입니다. 비록 그것이 사용자에게 피드백을 제공하는 가장 쉬운 경로이므로 적어도 하나 이상의 수준에서 소독해야합니다.

흠, 확실하지 않습니다. 이 기사를 읽을 때까지 컨트롤러를 다시 말했을 것입니다 : Skinny Controllers, Fat Model

http://blog.astrumfutura.com/archives/373-the-m-in-mvc-why-models-are-misunderstood-and-unepricated.html

대부분의 유효성 검사는 의존하기 때문입니다 비즈니스 규칙, 나는에 대한 검증을한다 비즈니스 계층 타사 도구 클래스로. 사용자 입력과 같은 다른 유형의 유효성 검사가 있지만 컨트롤러에는 이루어져야하지만 타사 클래스에서도 유효성 검사 규칙을 캡슐화 할 수 있습니다. 실제로, 그것은 무엇을 검증 해야하는지에 달려 있습니다.

클라이언트 측 유효성 검사는 작은 것입니다. 입력 유효성 검사, 그러나 서버 측 유효성 검사는 다음과 같습니다 항상 필요합니다. 사용자 입력을 신뢰할 수 없습니다.)

.그물 검증을 구축 할 수있는 멋진 컨트롤이 있지만 비즈니스 계층 데이터를 검증하려면 항상 더 나은 접근 방식이 필요하며 해당 제어는 해당 작업에 충분하지 않습니다.

보기에서 간단한 입력 유효성 검사. 모델의 전체 검증. 이유? 보기 기술을 변경하고 검증이 View/Controller에있는 경우 새보기에 대한 유효성 검사를 다시 작성해야합니다. 이것은 버그를 소개 할 수 있습니다. 모델에 넣으면 모든 견해에 의해 재사용됩니다 ...

그러나 내가 말했듯이, 속도와 편의에 대한 관점에서 간단한 검증.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top