2012-02-05 77 views
7

我忙于尝试理解c#中的安全性内容,并且很努力地看到Assert如何工作。我正在使用.net 3.5。在C中断言权限#

我做了一个示例应用程序,试图找出这一点。

调用方法:

[FileIOPermission(SecurityAction.Deny, ViewAndModify = @"C:\")] 
    static void Main(string[] args) 
    { 
     WriteTest testWriter = new WriteTest(); 
     testWriter.Test(); 
     Console.Read(); 
    } 

在一个单独的类库我有:

public class WriteTest 
{ 
    public void Test() 
    { 
     try 
     { 
      FileIOPermission permission = new FileIOPermission(FileIOPermissionAccess.Write, @"C:\"); 
      permission.Assert(); 
      using (StreamWriter sw = new StreamWriter(@"C:\test.txt")) 
      { 
       sw.WriteLine("testing!"); 
       sw.Flush(); 
      } 
      Console.WriteLine("Writen to file!"); 
     } 
     catch (SecurityException sec) 
     { 
      Console.WriteLine("No privileges!"); 
     } 
    } 
} 

此代码执行罚款和所有。它会写入文件。我的问题是这个工作到底如何?这是否不会使安全类无效,如果我可以断言我想要的权限,以便它跳过检查?如果我将Assert更改为Demand,则会引发异常。

安全类的重点是不允许我设置权限,以便当我打电话给第三方课时,我可以防止它流氓并做我不想做的事情?我知道如果我在AppDomain中加载DLL,即使第三方DLL使用Assert,我也会得到这种效果,但如果我直接调用它,这似乎很奇怪。我试过阅读关于Assert的MSDN文档,但我发现很难理解。

+0

请确保您需要了解.NET 4以前的安全模型...自.NET 4.0代码访问安全性已被简化。 – 2012-02-05 12:26:17

回答

3

Assert()更少 -Privileged代码(“Assembly A”)调用更多 -privileged代码(“Assembly B”)来执行某些任务时有用。要执行该任务,程序集B需要运行需要强大权限的代码 - 程序集A可能没有的权限。因此,大会B首先要求功能较弱的权限(首先执行任务的权限),然后声明更强大的权限以实际执行任务。

例如,假设部分信任的Silverlight应用程序想要使用System.Net.WebRequest类发出HTTP请求。建立网络连接需要SocketPermission,但这是一个强大的低级权限,不应授予来自Internet的不可信代码。因此WebRequest要求功能较弱的权限WebPermission,然后在继续建立网络连接之前声明SocketPermission。现在

,在具体的例子,因为类库是在相同的权限级别作为应用程序,同时应用程序和类库运行Assert()覆盖Deny很可能运行的完全信任。组件总是可以在其授予集中有任何许可。要在类库上执行Deny,您必须将类库放入沙箱中。

注意:在.NET 4.0中,Deny已被弃用。从MSDN Library

运行时支持已为强制执行的拒绝,RequestMinimum,RequestOptional和RequestRefuse权限请求删除。一般而言,这些请求并不完全了解,并且在未正确使用时存在安全漏洞的可能性:

  • 拒绝操作可能很容易被Assert操作覆盖。如果权限位于程序集的授予集中,程序集中的代码就能够执行Assert操作以获得权限。 Assert阻止了Deny在堆栈中被看到,使其无效。
+0

谢谢!这有助于理解这一切 – 2012-02-05 17:41:23

1

Assert()方法会导致代码访问安全性(CAS)停止在特定的权限检查请求上散步堆栈。

Assert是一种可以在代码访问权限 类和PermissionSet类上调用的方法。您可以使用断言来启用 您的代码(和下游呼叫者)执行代码为 有权执行的操作,但呼叫者可能没有权限执行操作。 安全声明更改了安全检查期间运行时 执行的正常过程。当您声明权限时, 会通知安全系统不要检查您的代码的调用者 声明的权限。

Using the Assert Method

我想你想Demand()

的意义:

+0

我明白它的作用,我只是为什么它这么做而感到困惑。在我看来,Assert只是否定了调用者设置的权限,这种设置权限对我来说似乎毫无意义。如果我导入一些第三方DLL并将其设置为没有写权限(就像我在这里做的那样),第三方DLL可以使用Assert并获得写权限? – 2012-02-05 10:15:34

+0

@DavidEsteves声明只适用于在程序集级别已具有写权限的DLL(例如,它们位于AppDomain的完全信任程序集列表中)。总之,这意味着“使用我的程序集级别权限覆盖堆栈级权限”。 – Medinoc 2017-02-03 13:46:10

+0

我们有SecurityPermissionFlag.Assertion的枚举(在SecurityPermission类中使用),可以在新的Appdomain的调用者中设置。它可以防止第三方组装从断言? – 2017-10-20 11:17:16