2008-12-09 3 views
5

SecurityAction 열거 형의 값의 의미와 목적을 설명 할 수있는 사람은 누구입니까?권한에 대한 .NET의 "SecurityAction"매개 변수 이해

MSDN 페이지의 심각성은 분명하지 않습니다. LinkDemand는 JIT (Just-In-Time) 컴파일에서 발생하는 반면 Demand는 런타임에 발생합니다.

왜 내가 구분하고 어떤 상황에서 LinkDemand를 수요와 반대로 사용합니까?

마찬가지로 InheritenceDemand, Assert 및 PermitOnly와 같은 다른 흥미로운 값의 사용 사례는 무엇입니까?

답변

18

LinkDemand는 기본적으로 호출 코드에 지정된 권한이 필요합니다. 반면에 수요는 호출 코드가 지정된 권한을 가질뿐만 아니라 호출 코드를 호출 한 코드와 호출 한 코드를 스택 위로 올리거나 (또는 ​​호출이 끝날 때까지) 필요합니다. Assert가 발견됩니다; 아래 참조).

LinkDemand는 JIT 컴파일러가 LinkDemand가있는 메소드를 호출하는 명령문에 부딪 힐 때 호출 코드에 권한이 있는지를 즉시 판별 할 수 있기 때문에 시행 할 수 있습니다. 컴파일 타임에 주어진 호출 동안 스택에 무엇이 있는지를 알기가 불가능하기 때문에 런타임에 메소드에 대한 호출이있을 때마다 요구 사항을 적용해야합니다. LinkDemand는 훨씬 더 효율적입니다. 그러나 그 효율성에 대한 절충은 보안 ​​성이 떨어진다. LinkDemand를 사용하면 호출 코드가 ITS 호출 코드 (권한이 있거나 없을 수도 있음)가 사악한 목적으로 사용하지 못하도록하는 것으로 신뢰하고 있습니다. 즉, 호출자가 LinkDemand를 사용하여 메서드에 간접적으로 액세스하기 위해 악용 할 수있는 보안 코드가 호출 코드에 없다는 것을 신뢰할 수 있습니다. 스택을 사용하는 모든 사람이 절대적으로 권한을가집니다. Assert가 발견 될 때까지 최소), 신뢰할 수없는 발신자로부터 위험이 없습니다.

어설 션은 기본적으로 수요에 대한 단락 회로입니다. Demand에서 발생하는 보안 검사는 스택의 호출자가 활성 Assert를 갖는 경우 중지됩니다. 즉, Assert까지 스택의 호출자 만 권한을 가져야합니다. 따라서 LinkDemand처럼 Assert 코드가 호출자에 의해 악용 될 수 없다는 것을 믿어야합니다.

거부 ​​또한 요청에 대한 단락이지만 권한을 주장하는 대신 호출자가 가질 수있는 권한을 취소합니다. 악용 될 수있는 호출 중에 외부 사용 권한이 없는지 확인하여 가능한 보안 허점을 방지하는 데 도움이됩니다.

PermitOnly는 특정 사용 권한을 거부하는 대신 지정된 사용 권한을 제외한 모든 사용 권한을 거부한다는 점을 제외하면 거부와 같습니다.

InheritanceDemand는 다른 것과 달리 메서드 호출과 직접적인 관련이 없지만 권한이없는 클래스는 InheritanceDemand를 사용하여 클래스에서 상속받을 수 없다고 말합니다. 예를 들어, 신뢰할 수없는 코드가 하위 클래스에서 액세스 할 수있는 클래스의 보호 된 멤버에 액세스하지 못하게하는 데 사용할 수 있습니다.