6

コード アクセス セキュリティを研究しています。理解するのに多少の努力が必要なので、最終的には Reflector を使用して、.NET 4.0 がセキュリティ属性をどのように使用するかを調査し始めようと考えました。

観察

メソッドは属性System.IO.File.Deleteで装飾されています。[SecuritySafeCritical]

このメソッドは、属性で装飾されSystem.IO.File.Deleteた内部メソッドInternalDelete[SecurityCritical]に委譲します。

MVC アプリ クラスの 1 つに、次のように実行されているDeleteFileというメソッドがあります (これは、 DeleteFileの MethodInfo.IsSecurityCritical プロパティSecurityTransparentをチェックして確認しました)。

権限

私の現在の理解から、それは次のことを意味します:

  1. System.IO.File.Delete はInternalDeleteを呼び出すことができます。これは、[SecuritySafeCritical]メソッドが呼び出すことができる[SecurityCritical]ため、SecurityException がスローされないためです。
  2. DeleteFileを呼び出すことができるため、System.IO.File.Deleteを呼び出すこと[SecurityTransparent]ができます。[SecuritySafeCritical]

したがって、基本的に、すぐに使用できるセキュリティ設定を調整しなくても、このコードは test.txt というダミー ファイルを正常に削除します。

namespace MyTestMvcApp
{
    public class FileHelpers()
    {
        // Has SecurityTransparent
        public void DeleteFile()
        {
            // Will succesfully delete the file
            File.Delete("test.txt");
        }
    }
}

錯乱

のInternalDeleteメソッド内で、メソッドをSystem.IO.File.Delete使用しCodeAccessPermission.Demandて、スタックのすべての呼び出し元が必要なアクセス許可を持っていることを確認します。私がよく理解していないのは、次の MSDN ドキュメントのCodeAccessPermission.Demand次の行です。

このメソッドを呼び出すコードの権限は検査されません。チェックは、そのコードの直接の呼び出し元から開始され、スタックを上に進みます。

私の質問は、私のアプリケーションのDeleteFileSecurityTransparentメソッドが である場合、どうしてメソッドを呼び出すことができるのSecurityCriticalでしょうか?

これはおそらくいくつかの概念が欠けている壊れた例ですが、私が言ったように、私はまだそれについて頭を悩ませています.

ありがとう

4

1 に答える 1

0

2つのCAS施行メカニズムを混同しています。それらは少し相互作用しますが、それはあなたが心配しているように見える方法とはまったく同じではありません。Demandで表されるように、完全な許可要求の目的では、それらは本質的に独立しています。

CLRは、コードを実行する前に透過性検証を適用します。これに合格すると、CLRは属性を介して適用された宣言型CAS要求を検証します。これらが合格した場合(または不在の場合)、CLRはコードを実行し、その時点で命令型(インライン)デマンドが実行されます。

「このメソッドを呼び出すコードの権限は検査されません」に関するDemandのドキュメントノートは、Demandメソッド自体に適用されます。つまり、Demandを呼び出すメソッドFooがある場合、検証されたコールスタックは、Foo自体ではなく、Fooの呼び出し元で開始されます。たとえば、コールチェーンがある場合A -> B -> C -> Foo -> Demand、A、B、およびCのみが検証され、許可されているかどうかが確認されます。

于 2012-06-04T14:18:26.127 に答える