メソッド アクセスの保護
信頼関係のない任意のコードに呼び出しを許可することが不適切なメソッドがあります。 このようなメソッドは、制限された情報を提供する、渡された任意の情報を信頼する、パラメーターのエラー チェックを行わない、誤ったパラメーターを受け取って正しく機能しないかなんらかの被害をもたらすなどの、いくつかの危険性をもたらします。 これらのケースを認識し、メソッドを保護するために役立つ措置を講じる必要があります。
パブリックでの使用を目的としていないメソッドをパブリックとして使用する場合は、メソッドを制限する必要があります。 たとえば、独自の DLL 経由で呼び出すインターフェイスはパブリックにする必要があります。しかし、顧客がそのインターフェイスを使用したり、悪意のあるコードがコンポーネントへのエントリ ポイントとして攻略したりするのを防ぐために、そのインターフェイスをパブリックとして公開しない場合があります。 また、パブリックではあるが、パブリック使用を想定していないメソッドを制限する一般的な理由として、非常に内部的なインターフェイスで、ドキュメントを残したり、サポートするのを避けたりする場合も考えられます。
マネージ コードには、メソッド アクセスを制限するいくつかの方法があります。
クラス、アセンブリ、派生クラスが信頼されている場合は、これらへのアクセシビリティのスコープを制限します。 これが、メソッド アクセスを制限する最も簡単な方法です。 派生クラスが親クラスの ID を共有することがありますが、一般的に、派生クラスは派生元のクラスよりも信頼度が低くなる可能性があります。 特に、キーワード protected からは信頼を推測しないでください。セキュリティ コンテキストでは、このキーワードの使用は必須ではありません。
メソッド アクセスを指定した ID の呼び出し元だけに制限します。基本的には、選択した特定の証拠 (厳密な名前、発行者、ゾーンなど) に限定します。
メソッド アクセスを、選択したアクセス許可を持つ呼び出し元だけに制限します。
同様に、宣言セキュリティを使用すると、クラスの継承を制御できます。 以下を実行する場合は InheritanceDemand を使用します。
派生したクラスに、特定の ID またはアクセス許可を要求します。
特定のメソッドをオーバーライドする派生クラスに、特定の ID またはアクセス許可を要求します。
呼び出し元に特定の厳密な名前による署名を要求することによってアクセスを制限し、パブリック クラスの保護に役立つ方法の例を次に示します。 この例では、厳密な名前を要求する Demand と共に StrongNameIdentityPermissionAttribute を使用しています。 アセンブリを厳密な名前で署名する方法のタスク ベースの情報については、「厳密な名前付きアセンブリの作成と使用」を参照してください。
<StrongNameIdentityPermissionAttribute(SecurityAction.Demand, PublicKey := "…hex…", Name := "App1", Version := "0.0.0.0")> _
Public Class Class1
End Class
[StrongNameIdentityPermissionAttribute(SecurityAction.Demand, PublicKey="…hex…", Name="App1", Version="0.0.0.0")]
public class Class1
{
}