19

シナリオ

次のコードがあるとしましょう:

[SecuritySafeCritical]
public void SomeMethod()
{
    SomeCriticalClass critical = new SomeCriticalClass();

    Action someDelegate = () => 
    {
         critical.Do();
    }

    someDelegate();
}
  1. SomeMethod署名には属性[SecuritySafeCritical]があります。
  2. SomeCriticalClass[SecurityCritical]クラスまたはメソッドのメソッドレベルのいずれかに属性を持つクラスDoです。
  3. に自動推論された匿名のデリゲートを作成しActionます。

問題

セキュリティ透過メソッド(匿名メソッド)がセキュリティクリティカルフィールド( SomeCriticalClassローカル変数)にアクセスしようとしているため、呼び出しcritical.Do()が発生します。MethodAccessException FieldAccessExceptioncritical

質問

これをどのように克服しますか?

[SecuritySafeCritical]簡単な方法は、匿名のデリゲートを使用する代わりに、でマークされた実際のメソッドを実装することです。しかし、これは私たちを匿名前の代表者とランバス時代に動かします。これは欲しくない。

他の簡単な方法は、セキュリティの透明性を使用しないことです。これは解決策ではありません。

Microsoftとオープンソースコミュニティの両方で利用可能なほとんどのライブラリは、セキュリティの透明性を念頭に置いて設計されていません。つまり、独自のカスタムコードは、methods / property/delegatesを介してサードパーティライブラリと相互運用する必要があり[SecuritySafeCritical]ます[SecurityCritical]

実際、セキュリティの透過性は、より優れた安全なソフトウェア設計を強制し、重要なアクションは非常にローカライズされ、残りのコードは最小限の権限で機能するため、優れたツールであると私は信じています。

4

1 に答える 1

18

申し訳ありませんが、他の回答者を待つことができませんでした...私は解決策を手に入れました!

[SecuritySafeCritical]実験によって、本体に匿名メソッドを作成するメソッドを持つクラスでマーキングすることで、うまくいくことがわかりました。

言い換えれば、またはコードについて話します

[SecurityCritical]
public class SomeCriticalClass
{
      [SecurityCritical]
      public void Do()
      {
      }
}

[SecuritySafeCritical]
public sealed class SomeClass
{
    [SecuritySafeCritical]
    public void SomeMethod()
    {
          SomeCriticalClass critical = new SomeCriticalClass()

          // No more FieldAccessException!
          Action action = () => critical.Do();         
    }
}

私はいくつかの説明をしたいと思います:

  • クラスSomeClassをでマークすることは、宣言されたすべてのメソッドがデフォルト[SecuritySafeCritical]であるという意味ではありません。これは、クラスが部分的に信頼された呼び出し元によって使用できることを意味します。部分的に信頼されている呼び出し元がアクセスできるメソッド、プロパティ、またはフィールドを属性でマークする必要があります。[SecuritySafeCritical][SecuritySafeCritical]

  • [SecuritySafeCritical]クラスレベルでは、ローカル変数と匿名メソッド(おそらく匿名オブジェクトも!)のセキュリティが安全に重要になるようです。

はい! 私の質問と私自身の答えの両方がすべての人に役立つことを願っています。私の質問で説明されている状況は頻繁に発生する可能性があると信じているからです。

于 2012-12-19T17:20:20.080 に答える