SecurityAction 列挙型の値の意味と目的を説明できる人はいますか?
MSDN ページはあまり明確ではありません。LinkDemand はジャストインタイム コンパイルで発生するのに対し、Demand は実行時に発生します。
Demand ではなく LinkDemand を使用する理由と、どのような状況で使用するのですか?
同様に、InheritenceDemand、Assert、PermitOnly などの他の興味深い値の使用例は何ですか。
SecurityAction 列挙型の値の意味と目的を説明できる人はいますか?
MSDN ページはあまり明確ではありません。LinkDemand はジャストインタイム コンパイルで発生するのに対し、Demand は実行時に発生します。
Demand ではなく LinkDemand を使用する理由と、どのような状況で使用するのですか?
同様に、InheritenceDemand、Assert、PermitOnly などの他の興味深い値の使用例は何ですか。
LinkDemand では、基本的に、呼び出し元のコードに指定されたアクセス許可が必要です。一方、デマンドでは、呼び出し元のコードだけでなく、呼び出し元のコードを呼び出したコード、それを呼び出したコードなど、スタックのずっと上 (またはassert が見つかりました (以下を参照)。
LinkDemand は、JIT コンパイル時に適用できます。これは、JIT コンパイラーが LinkDemand を使用してメソッドを呼び出すステートメントにヒットした場合、呼び出し元のコードにアクセス許可があるかどうかをすぐに判断できるためです。メソッドが呼び出されるたびに、実行時に要求を強制する必要があります。これは、特定の呼び出し中にスタックに何があるかをコンパイル時に知ることができないためです。そのため、LinkDemand ははるかに効率的です。ただし、その効率のトレードオフはセキュリティの低下です。LinkDemand を使用すると、呼び出し元のコードが ITS 呼び出し元のコード (アクセス許可を持っているかどうかに関係なく) が悪意のある目的で使用することはないと信頼できます。(つまり、呼び出し元が LinkDemand を使用してメソッドに間接的にアクセスするために悪用できるセキュリティ ホールが呼び出し元コードにないことを信頼しています。)
Assert は基本的に Demand のショート サーキットです。スタック上の呼び出し元がアクティブな Assert を持っている場合、Demand で行われるセキュリティ チェックは停止します (つまり、Assert までのスタック内の呼び出し元だけがアクセス許可を持つ必要があります)。したがって、LinkDemand と同様に、Assert を含むコードが呼び出し元によって悪用されないことを信頼する必要があります。
Deny は Demand の短絡でもありますが、アクセス許可をアサートする代わりに、呼び出し元が持っている可能性のあるアクセス許可を取り消します。これを使用して、悪用される可能性のある呼び出し中に無関係なアクセス許可が有効にならないようにすることで、セキュリティ ホールの可能性を防ぐことができます。
PermitOnly は Deny に似ていますが、特定のアクセス許可を拒否する代わりに、指定されたものを除くすべてのアクセス許可を拒否します。
InheritanceDemand は他のものとは異なり、メソッド呼び出しとは直接関係ありませんが、パーミッションを持たないクラスは InheritanceDemand を持つクラスから継承することはできないと言います。これは、たとえば、信頼されていないコードが、そうでなければ子孫クラスにアクセスできるクラスの保護されたメンバーにアクセスするのを防ぐために使用できます。