代码访问安全是一个笑话?

时间:2010-10-18 16:09:37

标签: .net security clr code-access-security

我刚刚阅读了有关代码访问安全性的article。它有这样一个例子:

using System.Security.Permissions;
public class MyFileAccessor 
{
  public MyFileAccessor(String path, bool readOnly)
  {
    path = MakeFullPath(path); // helper fcn
    FileIOPermissionAccess desiredAccess = readOnly
      ? FileIOPermissionAccess.Read
      : FileIOPermissionAccess.AllAccess;
    FileIOPermission p = new FileIOPermission(desiredAccess, path);
    p.Demand();
    // 
    ••• 
    open the file
   }
   // •••
}

如果我没有使用 FileIOPermissionAccess类型并且从未在我的代码中包含像 p.Demand()这样的代码,该怎么办?换句话说, 如果我想做一些不好的事情,为什么我还要费心去寻求许可? 这不是一个笑话吗?或者我错了吗?

3 个答案:

答案 0 :(得分:7)

嗯,是的,这个例子有点儿玩笑,你自己永远不会写这样的东西。缺少的是真正重要的部分,//打开文件的代码。例如,它的现实版本会调用CreateFile()。

关键是Windows不了解CAS。因此,如果您提供此类实用程序功能并且要强制执行CAS规则,则必须验证调用代码是否具有所需权限。当然,这种代码实际上只属于.NET框架。看看FileStream.Init()并注意在CreateFile调用之前需要FileIOPermission。

答案 1 :(得分:4)

文件访问权限(例如使用FileStream)会自动要求FileIOPermission。对于所有标准类都是如此,当他们执行某些需要权限的操作时,他们会自动要求它。查看.NET Framework安全性here。所以示例代码没用,没有人会明确要求文件权限。如果您开发一些API并且您的代码已签名以便没有人可以更改它,这是合理的。

进一步阅读,这里引用该文章:

  

现在,在现实世界中,您不会像MyFileAccessor这样编写类来访问文件。相反,您将使用系统提供的类,如System.IO.FileStream,它们已经设计为您进行适当的安全检查。它们通常在构造函数中完成,具有我之前讨论的所有性能和安全性含义。

答案 2 :(得分:3)

在java.io API中,您可以确保正在进行检查。如果要控制访问(在崩溃发生之前绕过崩溃),则必须在API调用的内部检查之前进行适当的检查。

Java代码通常在您控制的计算机上运行,​​但它也经常在您无法控制的计算机上运行。想想Java小程序。他们应该请求访问文件系统的权限,因为不应该允许程序的作者不受控制地访问其他人的文件系统。

如果你需要阻止一群人做恶意的事情,那么你需要阻止每个人做一些恶意的事情,以确保安全。否则,不法行为者只会说他们是受信任的未经检查的群体的一部分。

默认情况下,Java命令行可执行文件具有权限,允许您触摸自己的文件系统。假设如果你在本地启动程序,你可能会搞乱你有权访问的文件系统部分。 Applet启动时删除了所有这些默认权限。这样,浏览applet所在网页的人必须手动授予远程程序(applet)访问其文件系统的权限。

您可以看到这证明没有特殊的后门可以绕过某些用户的安全性(或者在某些情况下)。