リフレクションに関するセキュリティ上の考慮事項
非パブリック情報へのアクセスを提供することには、セキュリティのリスクが伴います。型についての非パブリック情報の探索を許可されているコードは、プライベートにしておく必要があるコード、データ、およびその他の情報にアクセスする可能性があります。そのため、.NET Framework のセキュリティでは、型情報やアクセスの種類を検出するためにどのレベルまでリフレクションを使用できるかを決定する規則が適用されます。実行する操作に応じて、ReflectionPermission か、またはシリアル化に対する SecurityPermission が必要です。
次のタスクは、アクセス許可がなくても、すべてのコードでリフレクションを使用して実行できます。
パブリック型とそのパブリック メンバについての情報の取得
コードがどのモジュールおよびアセンブリに含まれているかについての探索
パブリック型の列挙
リフレクションを使用しているコードと同じアセンブリ内にある非パブリック型の列挙
アセンブリとモジュールの列挙
パブリック メンバの呼び出し
呼び出し元コードの基本クラスのファミリ アクセス メンバの呼び出し
呼び出し元コードのアセンブリのアセンブリ アクセス メンバの呼び出し
非パブリック メンバについての情報を探索するには、呼び出し元が、型情報を取得する権限を表す ReflectionPermission を持っている必要があります。このアクセス許可がないと、コードは、Type、Assembly、および Module に対する Get メソッドを使用して、非パブリック メンバについての情報を取得するリフレクションを使用できません。
リフレクションを使用してメソッドを呼び出したり、共通型システムのアクセシビリティ規則に従ってアクセスが許可されていないフィールドにアクセスするには、コードにメンバ アクセスに対する ReflectionPermission を与える必要があります。
メモ : |
---|
インターネットを発生源とするコードには ReflectionPermission を与えないように、セキュリティ ポリシーを設定することをお勧めします。 |
シリアル化のための SecurityPermission によって、アクセシビリティに関係なく、シリアル化が可能な型の非一時的データ フィールド (つまり、メモリ以外にも存在するメンバ) を取得および設定できるようになります。このアクセス許可があると、インスタンスのプライベート状態を探索したり、変更できます。型に対して適切なアクセス許可が与えられていると同時に、メタデータ内でシリアル化可能としてマークされている必要があります。
リンク確認要求チェック
メソッドまたはデリゲートが許可 P に対する LinkDemand を持っている場合は、ランタイムはそのメソッドまたはデリゲートの呼び出し元に対してリンク確認要求チェックを実行して、リンク呼び出し元に許可 P が与えられていることを確認します。リンク確認要求チェックは、型情報の探索と呼び出しの両方に対して実行されます。
特に、大きな権限を持つコードには、MethodInfo パラメータを受け取るパブリック API を記述しないでください。アクセス許可で与えられた権限は、悪意のあるコードの攻撃を受けやすい場合があります。たとえば、大きな権限を与えられたコード内で、MethodInfo パラメータを受け取るパブリック API の場合を考えてみましょう。パブリック API が、供給されたパラメータに対して間接的に MethodInfo.Invoke を呼び出すと仮定します。パブリック API が必要なアクセス許可を確認しない場合、セキュリティ システムは呼び出し元が大きな権限を持っていると判断するため、その Invoke メソッド呼び出しは常に成功します。悪意のあるコードがそのメソッドを直接呼び出すアクセス許可を持っていなくても、パブリック API を呼び出すことによって間接的に Invoke メソッドを呼び出すことができます。
参照
関連項目
ReflectionPermissionFlag.TypeInformation
ReflectionPermissionFlag.MemberAccess
SecurityPermission