.NET 보안은 실제로 어떻게 작동합니까?
-
21-08-2019 - |
문제
방금이 질문을 보았습니다.
권한에 대한 .NET의 "보안 작용"매개 변수를 이해합니다
그리고 질문이 있습니다. 다음 코드로 :
private void button1_Click(object sender, EventArgs e)
{
Layer1();
MessageBox.Show("OK");
}
private void Layer1()
{
try
{
Layer2();
}
catch (SecurityException)
{
MessageBox.Show("Caught");
}
Layer2b();
}
private void Layer2()
{
new System.Security.Permissions.FileIOPermission(PermissionState.Unrestricted).Deny();
GC.Collect();
Layer3();
}
private void Layer2b()
{
Layer3();
}
[FileIOPermission(SecurityAction.LinkDemand, Write=@"C:\temp")]
private void Layer3()
{
using (FileStream stream = new FileStream(@"C:\temp\test.txt", FileMode.Create))
{
}
}
코드가 전화로 보안 예외를 생성하는 이유 Layer2
? 허가 대상은 어떻게 처리됩니까? 쓰레기 수집가가 객체를 파괴 할 것이라고 생각합니다. 잡았다, 그리고 확인, 명확하게 허가 거부는 Layer2를 통한 호출에 적용됩니다.
무엇을 제공합니까? 내가 무엇을 놓치고 있습니까? .NET의 보안/권한 시스템과 관련하여 총 초보자가 되겠다는 것을 인정 하므로이 질문이 실제로 기본적이라면 용서하십시오.
이 깃발과 같은 보안 권한/거부가 스택이나 무언가입니까? 그렇지 않으면 왜 layer2b에 적용되지 않습니까? 그것은 같은 스레드이기 때문에 쓰레기 수집에 의해 죽이지 않지만 어느 시점에서 제거/파괴/청소를 받고 있습니다.
해결책
CodeAccessPermission에서 .deny ()를 호출하면 .NET Security Runtime이 해당 권한의 현재 스택 프레임에 대한 보안 객체의 Deny 플래그를 설정하게됩니다. 따라서 .deny ()를 호출 한 후 gc.collect ()를 호출하더라도 실제로는 중요하지 않으므로 허가는 유효합니다. 권한 객체는 시점 (스택 프레임)에서 .NET 보안 런타임 부분의 상태를 나타내는 것입니다.
.NET 리플렉터를 사용하여 자세한 내용을 알아보십시오.
다른 팁
첫 번째 살펴보면 허가 객체가 여전히 범위에 있다고 생각합니다. 메소드 내부에서 정의되어 있으므로 Layer2 메소드가 완료된 후에도 범위가 떨어 지므로 응용 프로그램의 마지막 줄이 작동 할 수 있습니다.
허용 된 답변에서 언급 한 바와 같이, 이것은 표준 객체 범위와 관련하여 현재 스택의 범위에 있기 때문에 참조를 관리하지 않습니다. 그것이 그것을 기억하는 가장 좋은 방법입니다