リンク確認要求
リンク確認要求では、ジャスト イン タイム コンパイル時にセキュリティ チェックが実行され、コードの直接の呼び出し元アセンブリだけがチェックされます。 リンクは、コードが関数ポインター参照やメソッド呼び出しなどの型参照にバインドされるときに行われます。 コードにリンクするためのアクセス許可が呼び出し元アセンブリに不足している場合、リンクは実行できず、コードが読み込まれて実行されるときにランタイム例外がスローされます。 リンク確認要求は、コードから継承したクラス内でオーバーライドできます。
この種類の確認要求では完全なスタック ウォークは実行されず、コードは依然として攻撃の被害を受ける可能性があります。 たとえば、アセンブリ A のメソッドがリンク確認要求によって保護されている場合、アセンブリ B の直接の呼び出し元は、アセンブリ B のアクセス許可に基づいて評価されます。 ただし、アセンブリ C がアセンブリ B のメソッドを使用してアセンブリ A のメソッドを間接的に呼び出す場合、リンク確認要求はアセンブリ C のメソッドを評価しません。 リンク確認要求は、直接の呼び出し元アセンブリにある直接呼び出し元がコードにリンクする必要のあるアクセス許可だけを指定します。 そのコードを実行するためにすべての呼び出し元が持つ必要のあるアクセス許可は指定しません。
Assert、Deny、および PermitOnly スタック ウォーク修飾子は、リンク確認要求の評価に影響しません。 リンク確認要求はスタック ウォークを実行しないため、スタック ウォーク修飾子はリンク確認要求に対して効果はありません。
リンク確認要求によって保護されているメソッドがリフレクションを通じてアクセスされた場合は、リフレクションを使用してアクセスされたコードの直接の呼び出し元がチェックされます。 これは、リフレクションを使用して実行されるメソッドの探索とメソッドの呼び出しの両方に当てはまります。 たとえば、コードがリフレクションを使用して、リンク確認要求によって保護されているメソッドを表す MethodInfo オブジェクトを返してから、その MethodInfo オブジェクトを別のコードに渡し、渡された側のコードがそのオブジェクトを使用して元のメソッドを呼び出すとします。 この場合、リンク確認要求によるチェックは 2 回行われます。1 回目は MethodInfo オブジェクトを返すコードに対して、2 回目はメソッドを呼び出すコードに対して行われます。
メモ |
---|
静的コンストラクターは、アプリケーションのコード実行パスの外部でシステムによって呼び出されるため、静的クラス コンストラクターで実行されたリンク確認要求ではそのコンストラクターを保護できません。結果として、リンク確認要求がクラス全体に適用されたときに、その確認要求では静的コンストラクターへのアクセスを保護できません。ただし、クラスのそれ以外の部分については保護できます。 |
ReadData メソッドにリンクするすべてのコードが CustomPermission アクセス許可を持つ必要があることを宣言的に指定するコード片を次に示します。 このアクセス許可は架空のカスタム許可であり、.NET Framework には実在しません。 この確認要求は、CustomPermissionAttribute に SecurityAction.LinkDemand フラグを渡すことによって行われます。
<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.
}