0

breeze/odata 쿼리는 데이터에 대한 보안 액세스에 심각한 위험을 초래할 수 있습니다. 예를 들어 제한된 엔터티 (R)와 관련된 제한되지 않은 엔터티 (U)가 있다고 가정합니다. R에 대한 쿼리를 끝점에 표시하지 않고 관련 클라이언트를 포함하지 않고 내 클라이언트에 U 쿼리를 작성합니다. 그러나 악의적 인 클라이언트는 관련 R을 요청할 수 있습니다.odata/breezejs 쿼리의 결과에 역할 기반 보안을 적용하려면 어떻게해야합니까?

어떻게 방지합니까?

몇 가지 아이디어가 있습니다. 그러나 나는 그들이 일하는 것과하지 않은 것을 말할 수 있도록 아직 그들을 구현할 수 없었다. 아무래도 내 아이디어는 다음과 같습니다.

1) 쿼리가 실행 된 후 결과가 클라이언트로 전송되기 전에 결과 엔티티를 검사합니다. 하지만, 나는 실행과 클라이언트 사이의 전송 시점에 체크 포인트 코드를 삽입하는 방법을 모른다. (

) POCO에 스마트를 추가하여 제한된 엔티티와 속성을 확인한다. 사용자 역할. 대신 예를 들어하십시오 POCO이 바보 있어야하기 때문에 구역질 보인다

private string _p; 
public string P 
{ 
    get 
    { 
    if (UserRoles.HasAny("role-a","role-b")) 
     return _p; 
    return null; 
    } 
    set { _p = value; } 
} 

:

class MyThing{ 
    public string P {get;set;} 
} 

나는 이런 일이있을 것이다. POCO는 어딘가에서 사용자 역할을 읽을 수 있어야합니다 ... 어쩌면 HTTP 세션. 그게 어떻게 작동하는지 나는 잘 모른다.

나는 다음과 같은 질문/답변을 읽었습니다,하지만 그들은 나에게 도움이되지 않습니다 : roles based security in breezejs and EF6는, How is breeze.js handling security and avoiding exposing business logic, How to handle authorization with Breeze JS?

답변

0

당신은 $expand을 수행 클라이언트를 방지하기 위해 AllowedQueryOptions 를 사용할 수 this SO answer에 설명 된대로 .

또 다른 방법은 ODataQueryOptions을 WebAPI 컨트롤러 메서드의 매개 변수로 사용하는 것입니다. 이렇게하면 서버 메소드의 쿼리 조건 자에 대한 세부 정보가 제공되므로 WebAPI가 자동으로 적용하지 않고 필요할 때 적용 할 수 있습니다. 이렇게하면 쿼리를 기반으로 확장 여부를 결정할 수 있습니다.

어떻게 작동하는지 보려면 this answerthis answer을 참조하십시오.

+0

일부 경우 확장은 제한되지 않은 테이블에 허용되지만 제한된 테이블에는 허용되지 않으므로 확장 방지는 너무 광범위합니다. 이러한 종류의 메커니즘은 확장 할 수있는 테이블을 허용 할 수 없다면 작동 할 것입니다. 당신의 두 번째 생각에 관해서 : 나는 그것을 시도 할 것이다! 클라이언트 코드를 변경해야하는지 또는 매개 변수가 자동으로로드 될지 궁금합니다. 또한, 나는 1) odata 옵션을 검사하거나 2) odata 옵션을 적용하고, 쿼리를 실행 한 다음 쿼리 결과를 점검하도록 선택할 수 있다고 생각합니다. – steve

+0

그래서 options 매개 변수가 자동으로로드됩니다. 시원한! 그리고 그것은 때때로 ... 작동합니다. 하지만 때로는이 오류가 발생합니다 : [[System.NotSupportedException : 'System.Web.Http.OData.Query.Expressions.SelectExpandBinder + SelectAllAndExpand'1 유형을 형 변환 할 수 없습니다. [[DevList_Steve.Model.IssueTag, DevList-Steve, Version = 1.0.6103.15380, Culture = neutral, PublicKeyToken = null]] '을 입력하여'DevList_Steve.Model.IssueTag '를 입력하십시오. LINQ to Entities는 EDM 프리미티브 또는 열거 형을 캐스팅하는 것만 지원합니다.]] 슬프게도 저에게는 효과가 없을 것입니다. – steve

0

내 질문을 읽은 사람 덕분에 그것에 대해 생각하고 심지어 회신하기까지했습니다. 하지만, 나에게 도움이되는 제안은 없습니다. 그래서, 나는 그것을 스스로 알아 냈습니다. 내 브리짓 클래스를 서브 클래 싱하는 옵션 # 1을 구현할 수 있습니다. 내 QueryHelper 하위 클래스를 반환하려면 NewQueryHelper를 재정의 할 수 있도록 EnableBreezeQueryAttribute 하위 클래스입니다. 그런 다음 내 서비스 메서드에서 CustomEnableBreezeQueryAttribute를 사용합니다. ValidateData 메서드는 엔터티 개체와 함께 호출됩니다. 제한된 정보가 포함되어 있거나 제한된 정보를 비워 둘 수 있다면 제한없는 정보를 반환 할 수있는 방법으로 실패 할 수 있습니다.

public class CustomEnableBreezeQueryAttribute : EnableBreezeQueryAttribute 
{ 
    private class CustomQueryHelper : QueryHelper 
    { 
     public override IEnumerable PostExecuteQuery(IEnumerable queryResult) 
     { 
      queryResult = ValidateData(queryResult); 
      return base.PostExecuteQuery(queryResult); 
     } 

     private IEnumerable ValidateData(IEnumerable queryResult) 
     { 
      //TODO: validate/modify data 
     } 
    } 

    protected override QueryHelper NewQueryHelper() 
    { 
     return new CustomQueryHelper(); 
    } 
} 

나는 이것을하는 방법을 파악하는 것이 얼마나 힘들었는지에 놀랐습니다. 그리고이 시점에서 코드를 삽입하는 것이 쉽지는 않습니다. 잔소리가 가득한 질문들로 나를 남겨주세요. 나는 끝내면 안되는 일을하고 있습니까? 아니면 odata/breeze의 기능에 진정으로 구멍이 있습니까? 또는 odata/breeze에서 일이 어떻게 이루어지는가?