科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件.NET 框架中的安全性概述代码组

.NET 框架中的安全性概述代码组

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

.NET 框架中的安全性概述代码组

作者:Demien Watkins 2007年10月26日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

每个策略级别的核心是代码组树。它表示策略级别的配置状态。代码组实质是一个条件表达式和一个权限集。如果程序集满足该条件表达式,那么就会被授予该权限集。每个策略级别的代码组集是按树的形式组织的。一旦条件表达式的计算结果为真,就会被授予该权限集,然后继续在那个分支中遍历。只要不满足条件,就不授予权限集,也就不再进一步检查那个分支。例如,有一个代码组树,它是按照下面的这种情况运行的。

netframesecover_2

2. 策略级别的代码组树

这里我们只讨论用于实现默认安全策略的代码组类型的代码组语义。您也可以包括自定义编写的、语义完全不同于这里所描述的代码组。再提一下,安全系统是完全可以扩展的,因此它为引入新的策略计算语义提供了无限的可能性。

假设有一个程序集,它具有下列证据:它来自 www.monash.edu.au,因为它来自 Monash University 的 m-Commerce Center,所以它的强名称为 mCommerce。

代码组树遍历则会按照下列方式进行:

根节点有一个任何代码都满足的条件“all code”。因此将“all code”权限授予了我们这个程序集,这个权限集称为“Nothing”,它不允许代码具有任何权限。下一个检查的代码组是要求从 My Computer 加载代码的代码组。因为这个条件不满足,所以未授予权限集,因此也不会检查这个条件的任何下级节点。然后我们返回上一个成功授权的代码组(本例中是 all code),然后继续检查它的下级节点。下一个代码组是 Zone: Internet。因为我们的代码是从 Internet 上下载的,所以满足这个条件,从而授予了权限集(可能是 Internet 权限集),然后您就可以继续检查这个分支中的下一个下级代码组了。下一个代码组有一个 Url: 条件:指出代码来自 www.microsoft.com。由于代码是来自 www.monash.edu.au 的,所以不满足这个条件。此时我们会返回到 Zone: Internet 代码组,查找它下面的其他节点。我们为 URL: www.monash.edu.au 查找节点。由于满足了这个条件,我们得到了 MonashPSet 权限集。接下来我们为 Strong Name: m-Commerce center 查找节点。由于满足这个条件,我们得到了 m-Commerce 权限集。因为这个级别下面没有代码组,所以我们返回到匹配条件、且具有下级代码组的上一个代码组,然后继续。

最终,满足的条件和从这个策略级别中授予的权限集包括:

  • 条件:All code,权限集:Nothing

  • 条件:Zone: Internet,权限集:Internet

  • 条件:URL: www.monash.edu.au,权限集:MonashPSet

  • 条件:Strong Name: m-Commerce,权限集:m-CommercePSet

在一个策略级别中找到的适用于某个特定程序集的所有权限集通常会进行联合,以生成该策略级别授予的总权限集。

检查一个策略级别的代码组树是非常简单的。附录 A 描述了一个 Microsoft 管理控制台单元,该单元提供了一个用于查看和修改代码组的层次结构(以及策略级别的其他所有可配置组成部分,请参阅下面的内容)的可视界面。

命名权限集

一个策略级别包含一个命名权限集列表。每个权限集代表一个信任声明,用于访问各种受保护的资源。命名权限集是代码组按其名称进行引用的权限集。如果满足了代码组的条件,则会授予被引用的命名权限集(请参阅上面的示例)。下面是一些预定义的命名权限集示例:

  • FullTrust 允许不受限制地访问系统资源。

  • SkipVerification 允许程序集跳过验证。

  • Execution 允许代码执行。

  • Nothing 不授予权限。不授予执行的权限可有效停止代码的运行。

  • Internet 适合来自 Internet 的代码的权限集。代码将不会收到对文件系统或注册表的访问权限,但可以执行一些有限的用户界面操作,并且可以使用称为独立存储的安全文件系统。

要查看策略级别的权限集,只需在附录 A 提及的 GUI 工具中打开策略级别节点,然后打开权限集文件夹即可。

下面是一个很小的示例程序,它列出了所有策略级别上所有已知的命名权限集:

下面的程序显示了所有策略级别上的命名权限集列表。该应用程序是一个从本地磁盘运行的 C# 程序,因此它会从默认的策略设置中收到一个相当强大的权限集。

using System;
using System.Collections;
using System.Security;
using System.Security.Policy;

namespace SecurityResolver
{
  class Sample
  {
    static void Main(string[] args)
    {
      IEnumerator i = SecurityManager.PolicyHierarchy();
      while(i.MoveNext())
      {
         PolicyLevel p = (PolicyLevel) i.Current;
         Console.WriteLine(p.Label);
         IEnumerator np = p.NamedPermissionSets.GetEnumerator();
         while (np.MoveNext()) 
         {
           NamedPermissionSet pset = (NamedPermissionSet)np.Current;
           Console.WriteLine("\tPermission Set: \n\t\t Name: {0}
                             \n\t\t Description {1}", 
                            pset.Name, pset.Description);
         }
       }
    }
  }
}

该程序的输出如下。为简洁和明确起见,已对该输出进行了编辑。

Enterprise
  Permission Set:
    Name: FullTrust
    Description: Allows full access to all resources
  Permission Set:
    Name: LocalIntranet
    Description: Default rights given to applications 
                 on your local intranet
  ...
Machine
  Permission Set:
    Name: Nothing
    Description: Denies all resources, including the right to execute
  ...
User
  ...
    Name: SkipVerification
    Description: Grants right to bypass the verification
  Permission Set:
    Name: Execution
    Description: Permits execution
  ...
查看本文来源" target=_blank>查看本文来源
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章