Dav*_*ves 7 .net c# permissions code-access-security
我正忙着尝试理解c#中的安全性,我正在努力去了解Assert的工作原理.我正在使用.net 3.5.
我做了一个示例应用程序试图解决这个问题.
通话方式:
[FileIOPermission(SecurityAction.Deny, ViewAndModify = @"C:\")]
static void Main(string[] args)
{
WriteTest testWriter = new WriteTest();
testWriter.Test();
Console.Read();
}
Run Code Online (Sandbox Code Playgroud)
在一个单独的类库中,我有:
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!");
}
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码执行得很好.它将写入文件.我的问题是这究竟是如何工作的?如果我只是断言我想要的权限以便它跳过检查,这不会使安全类失效吗?如果我将Assert更改为Demand它会引发异常.
安全类的重点是不允许我设置权限,这样当我调用第三方类时,我可以防止它变成流氓并做一些我不希望它做的事情?我知道如果我在AppDomain中加载dll,即使第三方DLL确实使用Assert,我也会得到这种效果,如果我直接调用它就会起作用,这似乎很奇怪.我试过在Assert上阅读MSDN文档,但我发现很难理解.
Assert()
当权限较低的代码(“程序集 A”)调用more时很有用的代码(“程序集 B”)来执行某些任务为了执行该任务,程序集 B 需要运行需要强大权限\xe2\x80\x94a 权限的代码,而程序集 A 可能不具备该权限。因此,程序集 B 首先请求一个不太强大的权限(首先执行该任务的权限),然后断言更强大的权限来实际执行该任务。
例如,假设部分信任的 Silverlight 应用程序想要使用该类发出 HTTP 请求System.Net.WebRequest
。建立网络连接需要SocketPermission
,但这是一个强大的低级权限,不应授予来自 Internet 的不受信任的代码。因此WebRequest
需要一个不太强大的权限,WebPermission
然后SocketPermission
在继续建立网络连接之前断言。
现在,在您的特定示例中,将Assert()
覆盖,Deny
因为类库与应用程序以相同的权限级别运行\xe2\x80\x94应用程序和类库都可能以完全信任的方式运行。程序集始终可以Assert()
授予其授予集中的任何权限。要Deny
在类库上强制执行,您必须将类库放入沙箱中。
注意:在 .NET 4.0 中,Deny
已弃用。来自MSDN 库:
\n\n已删除对强制执行 Deny、RequestMinimum、RequestOptional 和 RequestRefuse 权限请求的运行时支持。一般来说,这些请求没有得到很好的理解,如果使用不当,可能会出现安全漏洞:
\n\n\n
\n- 拒绝操作可以很容易地被断言操作覆盖。如果权限位于程序集的授予集中,则程序集中的代码能够执行该权限的断言操作。断言阻止了在堆栈上看到拒绝,从而使其无效。
\n
归档时间: |
|
查看次数: |
2636 次 |
最近记录: |