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