7

I have just read about this article about Code Access Security. It has such an example in it:

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
   }
   // •••
}

What if I didn't use the FileIOPermissionAccess type and never includ code like p.Demand() in my code at all? In other words, if I want to do something bad, why should I bother to ask permission for that? Isn't it kind of a joke? OR did I take it wrong?

4

3 回答 3

7

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

关键是Windows对CAS一无所知。因此,如果您提供这样的实用程序函数并且想要强制执行 CAS 规则,那么您必须验证您的调用代码是否具有所需的权限。当然,这种代码真的只属于.NET框架。看看FileStream.Init()并注意在 CreateFile 调用之前需要 FileIOPermission。

于 2010-10-18T16:56:58.543 回答
4

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

进一步阅读,这是该文章的引述:

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

于 2010-10-18T16:24:03.823 回答
3

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

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

如果您需要阻止一组人做一些恶意的事情,那么您需要阻止每个人可能做一些恶意的事情,以确保安全性成为现实。否则,作恶者只会说他们是受信任的不受约束的团体的一部分。

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

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

于 2010-10-18T16:24:32.047 回答