シナリオ
次のコードがあるとしましょう:
[SecuritySafeCritical]
public void SomeMethod()
{
SomeCriticalClass critical = new SomeCriticalClass();
Action someDelegate = () =>
{
critical.Do();
}
someDelegate();
}
SomeMethod
署名には属性[SecuritySafeCritical]
があります。SomeCriticalClass
[SecurityCritical]
クラスまたはメソッドのメソッドレベルのいずれかに属性を持つクラスDo
です。- に自動推論された匿名のデリゲートを作成し
Action
ます。
問題
セキュリティ透過メソッド(匿名メソッド)がセキュリティクリティカルフィールド( SomeCriticalClassローカル変数)にアクセスしようとしているため、呼び出しcritical.Do()
が発生します。MethodAccessException
FieldAccessException
critical
質問
これをどのように克服しますか?
[SecuritySafeCritical]
簡単な方法は、匿名のデリゲートを使用する代わりに、でマークされた実際のメソッドを実装することです。しかし、これは私たちを匿名前の代表者とランバス時代に動かします。これは欲しくない。
他の簡単な方法は、セキュリティの透明性を使用しないことです。これは解決策ではありません。
Microsoftとオープンソースコミュニティの両方で利用可能なほとんどのライブラリは、セキュリティの透明性を念頭に置いて設計されていません。つまり、独自のカスタムコードは、methods / property/delegatesを介してサードパーティライブラリと相互運用する必要があり[SecuritySafeCritical]
ます[SecurityCritical]
。
実際、セキュリティの透過性は、より優れた安全なソフトウェア設計を強制し、重要なアクションは非常にローカライズされ、残りのコードは最小限の権限で機能するため、優れたツールであると私は信じています。