リンク確認要求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 のアクセス許可 ただし、リンク確認要求を評価しませんアセンブリ C のメソッドを間接的に呼び出すメソッドでアセンブリ B. メソッドを使用して、アセンブリの場合リンク確認要求では、直前の呼び出し元のアセンブリ内の呼び出し元は、コードへのリンクになっている可能性がありますが直接アクセス許可のみを指定します。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.

AssertDeny、および PermitOnly の各スタック ウォーク修飾子は、リンク確認要求の評価に影響を与えません。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. ここで、リンク確認要求のチェックは 2 回に発生します。 を返すコードに対して 1 回、 MethodInfoオブジェクトとそれを呼び出すコードに 1 回です。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.LinkDemandフラグを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