보안 조건을 사용하는 것이 MVC 위반입니까?


10

사용자에게 표시되는 내용 (예 : 웹 페이지)은 부분적으로 보안 검사를 기반으로합니다. 나는 보통 사용자 수준 / ACL 보안을 시스템의 비즈니스 로직의 일부로 생각합니다. 뷰가 UI 요소를 조건부로 표시하기 위해 보안을 명시 적으로 검사하는 경우 비즈니스 로직을 포함하여 MVC를 위반합니까?


대안은 무엇입니까?

1
안티 패턴 으로 간주 되더라도 최상의 보안을 제공하는 것을 사용합니다 .
zxcdw

답변:


6

모델과 뷰에 각각 두 가지 유형의 보안 조건이있을 수 있습니다. 보기는 현재 사용자의 권한에 따라 관련 요소의 표시를 제어하지만 모델은 기본 데이터에 대한 액세스를 제어합니다. 모델에 모든 올바른 검증 / 확인이있는 한, 뷰가 부족하더라도 보안은 여전히 ​​존재합니다.

뷰는 다른 레벨 / 역할에 따라 변경되어야하므로 일반적으로 둘 다 있어야합니다. 컨트롤러는보기를 변경하는 관련 데이터를 전송하지만,보기는 여전히 해당 데이터로 무언가를 수행하여 컨텐츠를 올바른 사용자에게 숨기거나 표시해야합니다.

그렇기 때문에 대부분의 템플릿 프레임 워크에는 조건부 요소가 있습니다 ( 핸들 바 예제).

{{#if isCurrentUserAdmin}}
    ....
{{/if}

따라서 적절한 부분이 올바른 한 위반이 아닙니다.


4

예, 아니오

실제 보안 결정이보기에 의해 결정되면 MVC를 위반 한 것입니다. 그러나 뷰가 실제 결정을 모델에 위임하면 괜찮습니다. 모델의 정보를 기반으로 어떤 요소를 표시할지 결정하는 데 아무런 문제가 없습니다.

예를 들어 "편집자"권한이있는 사용자에게만 표시되는 "편집"버튼이있는 경우보기에서 현재 사용자가 누구인지, "편집자"권한이 있는지 모델에 문의하는 것이 좋습니다. 이 정보를 사용하여 단추 표시 여부를 결정합니다. 그러나 뷰가 인증 및 권한 부여 논리 자체를 수행하려는 경우 MVC를 위반 한 것입니다.


2

나는 아니오 라고 말할 것이다 .

그러나 @rvcoutinho가 말한 것과 다른 이유로 (내 생각에 잘못된 느낌을주는 wikipedia를 인용했지만)

보안 비트에 대한 스위치를 가질 수 있기 때문에 관련 보안 문제는 뷰에 주어진 모델 (이 이유로 ViewModel을 사용하려는 조합 수에 따라 다름)과 공유해야한다고 말하고 싶습니다.

이를 통해 두 가지 계층의 보안 유효성 검사가 가능합니다. UI 계층에서는 정상적인 경우에 대한 포스트 백이, 모델이 자체적으로 보안 지식을 유지하고 컨트롤러가 정보를 전달하는 나쁜 행위자에 대한 서버 계층에서 우회됩니다. 즉시 던져 버리는 모델.

이와 같은 2 계층 보안은 업계 표준이며,이 방법으로 보안 로직이 두 곳에만 존재할 수 있으므로 보안 로직을 컨트롤러에 넣고 즉시 거기에 배치하면 보너스가됩니다. UI 및 모델 (모델은 마지막 방어선이므로 모델이 필요하며 데스크탑 클라이언트 또는 서버 관리 도구와 같이 해당 MVC 웹 앱 외부에서 사용하는 경우 특히 중요합니다)


"컨트롤러가 뷰의 모델 표현을 변경하기 위해 관련 뷰로 명령을 보낼 수 있다 "는 Wikipedia의 주장은 Model-View-Presenter에 더 적합 할 것입니다. 뷰가 렌더링되고 뷰와 컨트롤러 사이에 추가 작업이 수행되지 않습니다.
Robert Harvey

1
@RobertHarvey 나는 진술이 MVC에 대한 나의 정의에 맞지 않는다는 데 동의 할 것이지만 운이 좋은 것보다는 복수의 합의에 의해 정확성이 결정되는 산업에서 일하는 것이 운이 좋다. 모두가 자신의 테이크 아웃을 할 수 있도록 끊임없이 진화하는 기초. 또는 더 분명한 말로, 나는 아마 여기의 다른 사람들처럼 잘못되었을 것입니다.
Jimmy Hoffa

3
그래서 나는 사람들이 어쨌든 이런 종류의 일에 대해 너무 현혹 적이라고 생각합니다.
Robert Harvey

1
@rvcoutinho 나는 전혀 말하고 싶지 않다. 당신은 당신 편에 참고 문헌을 가지고 있습니다. 내가 가진 모든 것은 내 의견이므로, 내 마음에 그것은 내가 틀렸을 가능성이 있음을 의미하므로 내가 언급 한 이유입니다. 내 의견은 언급이 없더라도 공유할만한 가치가 있다고 생각하므로 어쨌든 내가 말한대로 내가 틀렸다는 사실에 관계없이 그것을했다.
Jimmy Hoffa

1
@ rvcoutinho : 사실, 나는 OP의 질문을 언급하고있었습니다. :) 규칙이 무언가를 수행하는 데 방해가되지 않는 한 규칙에는 아무런 문제가 없습니다.
Robert Harvey

2

나는 아니오 라고 말할 것이다 .

일반적으로 이러한 종류의 보안 검사는 컨트롤러에 의해 수행됩니다.

Wikipedia 에서와 같이 :

컨트롤러는 뷰의 모델 표현을 변경하기 위해 명령을 관련 뷰로 보낼 수 있습니다

그리고 나는 그것이 직접 관점에서 이루어져야한다고 생각하지 않습니다. 예를 들어 자바 스크립트를 통해 수행되는 경우 보안 문제 일 수 있습니다 (자바 스크립트를 사용 중지하고 권한있는 데이터에 액세스 할 수 있음).

다시, Wikipedia에서 :

뷰는 모델에서 출력 표현 을 생성하는 데 필요한 정보를 요청합니다 .


1
많은 소프트웨어 시스템에서 요소 표시 는 사용자의 보안 수준에 따라 다릅니다. 뷰 모델에서 데이터 항목을 0 또는 널로 설정하여 데이터 항목이 표시되지 않도록 할 수는 있지만 데이터 항목의 이름 또는 설명은 계속 표시됩니다. 실제적인 방법으로 데이터 항목 설명의 표시를 금지 할 수있는 유일한 곳은보기에 있습니다.
Robert Harvey

나는 동의하지 않는 경향이있다. 뷰가 데이터를 요청하고 컨트롤러가 모델을 조작하고 뷰가 다시 표현한다고 말할 것입니다. 뷰는 출력 표현에만 책임이 있습니다.
rvcoutinho

그렇기 때문에 View는 사용자가 볼 필요가없는 시각적 요소를 숨겨야합니다. 컨트롤러는 데이터의 시각적 표현을 생성 할 책임이 없습니다. 보기입니다. 물론, 표시하는 내용이 너무 민감하여 View / Source에있을 수없는 경우 컨트롤러가 수행해야 할 작업은 다른 보기를 반환하는 입니다.
Robert Harvey

1
그게 내 요점이야 보기가 달라야합니다. 내가 이해하는 한, 뷰는 데이터 표현만을 처리 해야하는 것처럼 보입니다. 표현으로, 나는 그것을 보여줄 때가 아니라 무언가를 보여주는 방법을 의미 할 것입니다. 그러나 귀하의 의견은 전적으로 관련이 있습니다.
rvcoutinho

글쎄, 우리는 두 가지 다른 일에 대해 같은 표현을 사용하고 있다고 생각합니다. 어쨌든 다른 견해는 무엇입니까? 그러나 우리는 가장 중요한 문제에 동의한다고 생각합니다. 보안에 민감한 경우 견해로 처리해서는 안됩니다.
rvcoutinho

1

이 질문에는 몇 가지 문제가 있습니다.

  1. 인증 (이 사용자가 자신이라고 말한 사람)은 보기와 관련 해서는 안됩니다 .
  2. 권한 부여 (현재 사용자 가이 작업을 수행 할 수 있습니까 ) 사용자에게 제공되는 내용에 영향을 줄 수 있으므로보기의 문제입니다. 따라서 편집 버튼을 표시하기위한 코드를와 같은 조건으로 둘러 쌀 수 있습니다 if model.userCanEdit() ... endif.
  3. 사용자에게 어떤 권한 부여 속성이 있는지 결정하는 것은 비즈니스 로직이며 모델에 배치해야합니다. 예를 들어 '편집'권한을 사용하려면 평판이 2000이어야하거나 저자 또는 중재자 여야합니다.

0

UI 요소를 표시하는 것만이라면 괜찮습니다 (어쨌든 어떻게 할 것입니까?). 해당 요소에 데이터가있는 경우 모델은 컨테이너가 비어 있는지 확인해야합니다. 물론 권한 데이터를 가져 오는 코드는보기 전에 처리되어야하므로 여기서 모델에 대한 활성 액세스가 없습니다.


0

뷰가 UI 요소를 조건부로 표시하기 위해 보안을 명시 적으로 검사하는 경우 비즈니스 로직을 포함하여 MVC를 위반합니까?

예, MVC 위반입니다.

보기에는 요소 만 표시되며 논리는 모델에 있어야합니다. 뷰가 무언가를 수행하도록 (귀하의 경우 보안을 확인) 로직을 배치합니다.


그렇다면보기는 편집 버튼과 같은 것을 표시할지 여부를 어떻게 알 수 있습니까?
Matt S

@MattS 발표자는 뷰에서 함수를 호출하여 해당 단추를 표시하거나 숨 깁니다 (모델의 상태에 따라 다름).
BЈовић
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.