링크 요청Link Demands

주의

코드 액세스 보안 및 부분적으로 신뢰할 수 있는 코드Code Access Security and Partially Trusted Code

.NET Framework는 동일한 애플리케이션에서 실행되는 다른 코드에 다양한 신뢰 수준을 적용하기 위한 CAS(코드 액세스 보안)라는 메커니즘을 제공합니다.The .NET Framework provides a mechanism for the enforcement of varying levels of trust on different code running in the same application called Code Access Security (CAS). .NET Framework의 코드 액세스 보안은 코드 발생 위치 또는 코드의 다른 ID 측면에 따라 보안 경계를 적용하기 위한 메커니즘으로 사용해서는 안 됩니다.Code Access Security in .NET Framework should not be used as a mechanism for enforcing security boundaries based on code origination or other identity aspects. 앞으로 코드 액세스 보안 및 보안 투명 코드를 부분적으로 신뢰할 수 있는 코드, 특히 출처를 알 수 없는 코드의 보안 경계로 사용할 수 없음을 나타내도록 지침이 업데이트되었습니다.We are updating our guidance to reflect that Code Access Security and Security-Transparent Code will not be supported as a security boundary with partially trusted code, especially code of unknown origin. 대체 보안 조치를 적용하지 않고 출처를 알 수 없는 코드를 로드 및 실행하지 않는 것이 좋습니다.We advise against loading and executing code of unknown origins without putting alternative security measures in place.

이 정책은 모든 버전의 .NET Framework에 적용되지만 Silverlight에 포함된 .NET Framework에는 적용되지 않습니다.This policy applies to all versions of .NET Framework, but does not apply to the .NET Framework included in Silverlight.

링크 요청으로 인해 Just-In-Time 컴파일 동안 보안 검사를 수행하며 코드의 직접 호출 어셈블리만 검사합니다.A link demand causes a security check during just-in-time compilation and checks only the immediate calling assembly of your code. 연결은 함수 포인터 참조 및 메서드 호출을 포함하여 코드가 형식 참조에 바인딩된 경우에 발생합니다.Linking occurs when your code is bound to a type reference, including function pointer references and method calls. 호출 어셈블리에 코드에 연결할 권한이 없는 경우 링크가 허용되지 않으며 코드가 로드 및 실행될 때 런타임 예외가 발생합니다.If the calling assembly does not have sufficient permission to link to your code, the link is not allowed and a runtime exception is thrown when the code is loaded and run. 코드에서 상속하는 클래스에서 링크 요청을 재정의할 수 있습니다.Link demands can be overridden in classes that inherit from your code.

이 형식의 요청에서는 전체 스택 워크가 수행되지 않으며 코드가 여전히 보안 공격에 취약합니다.Note that a full stack walk is not performed with this type of demand and that your code is still susceptible to luring attacks. 예를 들어 어셈블리 A의 메서드가 링크 요청에 의해 보호 되 면 어셈블리 b의 직접 호출자는 어셈블리 B의 권한에 따라 평가 됩니다. 그러나 어셈블리 B의 메서드를 사용 하 여 어셈블리 A에서 메서드를 간접적으로 호출 하는 경우 링크 요청은 어셈블리 C의 메서드를 평가 하지 않습니다. 링크 요청은 직접 호출 어셈블리의 직접 호출자가 코드에 연결 하는 데 필요한 권한만 지정 합니다.For example, if a method in assembly A is protected by a link demand, a direct caller in assembly B is evaluated based on the permissions of Assembly B. However, the link demand will not evaluate a method in assembly C if it indirectly calls the method in assembly A using the method in assembly B. The link demand specifies only the permissions direct callers in the immediate calling assembly must have to link to your code. 모든 호출자가 코드를 실행하는 데 필요한 권한은 지정하지 않습니다.It does not specify the permissions all callers must have to run your code.

Assert, DenyPermitOnly 스택 워크 한정자는 링크 요청의 평가에 영향을 주지 않습니다.The Assert, Deny, and PermitOnly stack walk modifiers do not affect the evaluation of link demands. 링크 요청은 스택 워크를 수행하지 않으므로 스택 워크 한정자가 링크 요청에 영향을 주지 않습니다.Because link demands do not perform a stack walk, the stack walk modifiers have no effect on link demands.

리플렉션을통해 링크 요청에 의해 보호 되는 메서드에 액세스 한 경우 링크 요청은 리플렉션을 통해 액세스 되는 코드의 직접 실행 호출자를 확인 합니다.If a method protected by a link demand is accessed through Reflection, then a link demand checks the immediate caller of the code accessed through reflection. 이는 리플렉션을 사용하여 수행된 메서드 호출 및 메서드 검색 둘 다에 적용됩니다.This is true both for method discovery and for method invocation performed using reflection. 예를 들어 코드에서 리플렉션을 사용 하 여 링크 MethodInfo 요청으로 보호 되는 메서드를 나타내는 개체를 반환한 다음 개체를 사용 하 여 원래 메서드를 호출 하는 다른 코드에 MethodInfo 개체를 전달 한다고 가정 합니다.For example, suppose code uses reflection to return a MethodInfo object representing a method protected by a link demand and then passes that MethodInfo object to some other code that uses the object to invoke the original method. 이 경우 링크 요청 검사는 MethodInfo 개체를 반환 하는 코드에 대해 한 번, 그리고 호출 하는 코드의 경우 한 번 수행 됩니다.In this case the link demand check occurs twice: once for the code that returns the MethodInfo object and once for the code that invokes it.

참고

정적 생성자는 애플리케이션 코드 실행 경로 외부의 시스템에서 호출되므로 정적 클래스 생성자에서 수행되는 링크 요청은 생성자를 보호하지 않습니다.A link demand performed on a static class constructor does not protect the constructor because static constructors are called by the system, outside the application's code execution path. 따라서 링크 요청이 전체 클래스에 적용되는 경우 클래스의 나머지 부분은 보호하지만 정적 생성자에 대한 액세스를 보호할 수 없습니다.As a result, when a link demand is applied to an entire class, it cannot protect access to a static constructor, although it does protect the rest of the class.

다음 코드 조각에서는 ReadData 메서드에 연결하는 코드에 CustomPermission 권한이 있어야 함을 선언적으로 지정합니다.The following code fragment declaratively specifies that any code linking to the ReadData method must have the CustomPermission permission. 이 권한은 가상의 사용자 지정 권한이며 .NET Framework에 존재하지 않습니다.This permission is a hypothetical custom permission and does not exist in the .NET Framework. 요청은 SecurityAction 플래그를에 CustomPermissionAttribute전달 하 여 수행 됩니다.The demand is made by passing a SecurityAction.LinkDemand flag to the CustomPermissionAttribute.

<CustomPermissionAttribute(SecurityAction.LinkDemand)> _  
Public Shared Function ReadData() As String  
    ' Access a custom resource.  
End Function    
[CustomPermissionAttribute(SecurityAction.LinkDemand)]  
public static string ReadData()  
{  
    // Access a custom resource.  
}  

참고자료See also