문제

이 코드에서는 readfilesystem 메소드가 파일 시스템에 대한 권한을 주장하는 것이 금지되어 있기를 바랍니다.

나는 이것이 fileio.assert ()에 던져 질 것으로 예상했지만 그렇지 않습니다. 왜요?

using System.Security.Permissions;
static void Main(string[] args)
{
    var fileIo = new FileIOPermission(PermissionState.Unrestricted);
    var secuPerm = new SecurityPermission(SecurityPermissionFlag.Assertion);
    PermissionSet set = new PermissionSet(PermissionState.Unrestricted);
    set.AddPermission(fileIo);
    set.AddPermission(secuPerm);
    set.Deny();
    ReadFileSystem();
    Console.Read();
}

private static void ReadFileSystem()
{
    var fileIo = newFileIOPermission(PermissionState.Unrestricted);
    fileIo.Assert();

    DirectoryInfo dir = new DirectoryInfo("C:/");
    dir.GetDirectories();
}

업데이트

CAS에 대한 훌륭한 링크 : http://blogs.msdn.com/shawnfa/archive/2004/08/25/220458.aspx

도움이 되었습니까?

해결책

후속 주장은 거부의 영향을 무효화한다.

Fileiopermission을 주장하는 능력은 주로 조립이 신뢰할 수 있는지에 달려 있습니다. 이전의 파일 지각 거부에 영향을받지 않습니다. 그것은 또한 이전의 Assertion Securitypermission의 거부에 의해 영향을받지 않는 것으로 밝혀졌다. SecurityPermissionFlag.Assertion이 링크 시간 수요로 점검되기 때문입니다. 이것은 명확하게 문서화되어 있지 않습니다. 찾았어요 여기.

CLR이 Fileiopermission에 대한 어셈블리를 신뢰하지 않도록하려면 사용 설명서에 따라 파일 상단에 다음을 사용할 수 있습니다. 파일에 이것을 추가하면 인식이 적용되지 않습니다. 이것은 전체 어셈블리에 영향을 미칩니다. 더 미세한 세분성은 없습니다.

[assembly:FileIOPermission(SecurityAction.RequestRefuse, Unrestricted=true)]

다른 팁

나는 당신이 권한을 주장하는 목적을 오해 할 수 있다고 생각합니다. CAS로 설정된 허가를 주장 할 때, 당신은 효과적으로 "내가하고있는 일을 알고 있습니다 ... 나는 스택에 더 깊은 권한이 무엇인지 상관하지 않습니다." 그게 거의입니다 절대 당신이 원하는 것. 일반적으로 권한 세트를 요구하고 싶습니다. 이로 인해 스택 워크가 발생하여 스택에서 거부를 발견 한 다음 보안 예외가 발생합니다.

그러나 .NET은 사실상 필요한 모든 요구를 내장하고 있으므로 어설 션을하지 않는 한 (다시 드문 경우) 자신의 사용자 정의 권한 클래스를 작성하지 않는 한 실제로 아무것도 요구할 필요가 거의 없습니다.

확실히 좋은 질문. 나는 코드를 실행했고 약간 신비화된다. 나는 단지 한 시간 또는 2 번의 문서를 공부하고 인터넷 검색을하지만 아무 소용이 없습니다. MSDN은 주장 허가에 대한 요구를 수행하여 경찰을 겪습니다.

편집 : BinaryCoder의 대답은 나를 올바른 방향으로 지적했습니다.

주장 권리는입니다 단순히 효과적이지 않습니다 풀 스러스트 어셈블리에서. 파일 상단에 다음을 추가 한 경우에만 다음과 같습니다.

[assembly: SecurityPermissionAttribute(SecurityAction.RequestRefuse, Assertion = true)] 

fileio.assert ()에 대한 호출이 실패합니다.

그러나 그렇지 않으면 () () 어설 션 허가와 다음 속성을 거부하려고 시도하는 것은 완전히 비효율적입니다.

[SecurityPermissionAttribute(SecurityAction.Deny, Assertion = true)]
private static void ReadFileSystem() {}

문서는 Assert () '몇 가지 보안 문제가 있으며 권장 사항은 항상 assert를 요구하는 것입니다.

fileIo.Demand();
fileIo.Assert();

그러나 나는 여전히 최소한의 특권의 원칙을 적용하는 것에 대한 나의 사고 방식을 다시 조정해야합니다.

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