.NET(C#)中不同级别的安全透明代码对类型的影响

测试代码将测试一个方法和类默认在全部信任权限下和部分信任权限下的代码类型。

上面说的默认就是指未加入其他安全透明类型的特性。

代码类型可以是:

  1. 透明代码(Transparent Code)
  2. 关键代码(Critical Code)
  3. 可靠关键代码(Safe-critical Code)

测试这三项用到Type类和MethodInfo类中的IsSecurityTransparent,IsSecurityCritical和IsSecuritySafeCritical。注意这些属性不是从它们的共同基类MemberInfo中继承来的,因为某些MemberInfo比如属性(Property)是不属于可标识的。(但是属性的get和set可以,他们属于方法)

至于模拟部分受信任代码,我们通过创建一个给予部分权限的应用程序域然后在该应用程序域中执行代码。

测试代码框架:

using System;

using System.Reflection;

using System.Security;

using System.Security.Permissions;

class Program

{

static void Main()

{

//在全部受信任环境中运行

test();

//创建部分受信任应用程序域

var d = CreateSandbox();

//在部分受信任环境中运行

d.DoCallBack(() =>

{

test();

});

}

//测试方法

static void test()

{

if (AppDomain.CurrentDomain.IsFullyTrusted)

Console.WriteLine("全部受信任环境");

else

Console.WriteLine("部分受信任环境");

var method = MethodBase.GetCurrentMethod();

//判断方法

Console.WriteLine("默认方法 - 透明代码:{0,-5} 关键代码:{1,-5} 关键可靠代码:{2}",

method.IsSecurityTransparent,

method.IsSecurityCritical,

method.IsSecuritySafeCritical);

//判断类型

Console.WriteLine("默认类型 - 透明代码:{0,-5} 关键代码:{1,-5} 关键可靠代码:{2}\n",

method.DeclaringType.IsSecurityTransparent,

method.DeclaringType.IsSecurityCritical,

method.DeclaringType.IsSecuritySafeCritical);

}

//创建部分受信任环境

static AppDomain CreateSandbox()

{

//初始化空的权限集

var pset = new PermissionSet(PermissionState.None);

//添加Execution(执行)安全权限,没有此权限代码不会执行

pset.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));

//添加其他权限

pset.AddPermission(new FileIOPermission(PermissionState.Unrestricted));

pset.AddPermission(new UIPermission(PermissionState.Unrestricted));

pset.AddPermission(new ReflectionPermission(PermissionState.Unrestricted));

//必须设置AppDomainSetup.ApplicationBase,否则无法成功创建应用程序域

var adSetup = new AppDomainSetup();

adSetup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;

var domain = AppDomain.CreateDomain("新的AppDomain",

null,

adSetup,

pset);

return domain;

}

}

在级别2中的结果是这样的(.NET 4.0后(包括4.0)CLR默认会使用级别2类型)

运行结果:

全部受信任环境

默认方法 - 透明代码:False 关键代码:True  关键可靠代码:False

默认类型 - 透明代码:False 关键代码:True  关键可靠代码:False

部分受信任环境

默认方法 - 透明代码:True  关键代码:False 关键可靠代码:False

默认类型 - 透明代码:True  关键代码:False 关键可靠代码:False

可以看出来,在级别2中,全部信任环境下,类型和成员都是关键代码。而部分信任环境下,它们都是透明代码。

如果手动在程序集中添加SecurityTransparent或AllowPartiallyTrustedCallers,则默认全部是透明代码:

using System.Security;

//[assembly: SecurityRules(SecurityRuleSet.Level1)]

//[assembly: SecurityCritical]

//.NET 4.0 +

[assembly: AllowPartiallyTrustedCallers]

//或者

[assembly: SecurityTransparent]

运行结果:

全部受信任环境

默认方法 - 透明代码:True  关键代码:False 关键可靠代码:False

默认类型 - 透明代码:True  关键代码:False 关键可靠代码:False

部分受信任环境

默认方法 - 透明代码:True  关键代码:False 关键可靠代码:False

默认类型 - 透明代码:True  关键代码:False 关键可靠代码:False

即便是全部信任环境,默认仍是透明代码。

在级别1中,首先得通过SecurityRules特性调节CLR运行程序集时采用级别1策略。

using System.Security;

[assembly: SecurityRules(SecurityRuleSet.Level1)]

然后再运行程序,结果:

全部受信任环境

默认方法 - 透明代码:False 关键代码:True  关键可靠代码:True

默认类型 - 透明代码:True  关键代码:False 关键可靠代码:False

部分受信任环境

默认方法 - 透明代码:True  关键代码:False 关键可靠代码:False

默认类型 - 透明代码:True  关键代码:False 关键可靠代码:False

在受限环境下,同级别1一样都一律视为透明代码。但在全部信任环境下,类型会被视为透明代码。但方法(或者其他类型成员)会被视为关键可靠代码(SecuritySafeCritical),由于是SecuritySafeCritical所以一定也属于SecurityCritical,因此关键代码也是True。

所以在级别1中,全部信任环境的代码是默认可以被部分受信任的代码访问的,如果你不想这样做,可以强命名整个程序集,级别1中强命名的程序集的所有公共成员会有隐式的全部权限的Link Demand,这样部分信任环境的程序集就无法访问了。当然手动添加Link Demand或者全部调用堆栈遍历(full demand)也可以。

在级别1中,SecurityTransparent特性和级别2一样,都会使整个程序集的全部成员成为透明代码。而AllowPartiallyTrustedCallers特性则不一样,它主要用来用在强命名的程序集中强制取消隐式的Link Demand。这样的话,程序集又可以被部分受信任代码所访问。如果想保护某些成员,可以手动添加SecurityCritical特性或者显示的Link Demand。

级别1中的SecurityCritical特性也有其他用处:

using System.Security;

[assembly: SecurityRules(SecurityRuleSet.Level1)]

[assembly: SecurityCritical]

如果这样使用,那么它和SecurityTransparent一样,只不过你可以手动在成员上再加SecurityCritical来指定它不是透明代码。

如果你想使整个程序集全部是关键代码的话(在级别2,默认就是这样的),使用SecurityCritical的Scope属性为Everything(在.NET 4.0中已废弃,由于.NET 4.0默认是使用级别2的):

using System.Security;

[assembly: SecurityRules(SecurityRuleSet.Level1)]

[assembly: SecurityCritical(SecurityCriticalScope.Everything)]

再运行代码,全部成员就是关键代码了(仅在全部权限下,部分权限下始终是透明代码)

全部受信任环境

默认方法 - 透明代码:False 关键代码:True  关键可靠代码:False

默认类型 - 透明代码:False 关键代码:True  关键可靠代码:False

时间: 2024-10-14 20:01:42

.NET(C#)中不同级别的安全透明代码对类型的影响的相关文章

帮用户解决以往消费中的例如信息不透明、使用不便捷、无法按照服务质量付费等痛点(转)

在所有还算得上成功的互联网公司中,大众点评一直是一个异类. 它既不会像其它公司那样像坠落凡间的天使,只需要短短几年的修复,迅速克隆一个“美国公司”,就立马可以腾云驾雾,再次回到天堂:也不像那些泯然众人的公司那样,似乎永远不在舆论的中心,但一直默默在赚钱,只是在某一个瞬间,纳斯达克的钟声将人们唤醒,“哦,原来它这么厉害”! O2O 2.0 的演变 7 月 22 日,久不露面的大众点评 CEO 张涛出现在了成立丽人事业部的发布会上,除了为其新拓展的丽人事业部站台之外,张涛对外纰漏了大众点评未来的发展

使用Auto Layout中的VFL(Visual format language)--代码实现自动布局

使用Auto Layout中的VFL(Visual format language)--代码实现自动布局 2014-12-09 10:56 编辑: zhiwupei 分类:iOS开发 来源:机智的新手投稿 6 23450 Auto Layout自动布局VFL 招聘信息: 高级iOS开发工程师 高级PHP开发工程师 iOS高级研发工程师 iOS开发工程师 高级iOS手机应用软件开发工程师(培训讲师) 高级Cocos2d-x游戏开发工程师(培训讲师) iOS手机软件开发工程师 iOS工程师 Web后

(转)兼容主流浏览器的CSS透明代码

透明往往能产生不错的网页视觉效果下面是兼容主流浏览器的CSS透明代码.transparent_class { filter:alpha(opacity=50); -moz-opacity:0.5; -khtml-opacity: 0.5; opacity: 0.5; } filter:alpha(opacity=50):这个是为IE6设的,可取值在0-100,其它三个0到1.-moz-opacity:0.5; 这个是为了支持一些老版本的Mozilla浏览器.-khtml-opacity: 0.5

编程算法 - 数组中出现次数超过一半的数字 代码(C)

数组中出现次数超过一半的数字 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 数组中有一个数字出现的次数超过数组长度的一半, 请找出这个数字. 1. 使用高速排序(QuickSort)的方法, 把中值(middle)和索引(index)匹配, 输出中值, 并检測是否符合要求. 2. 使用计数方法依次比較. 代码:  方法1: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */

更改CloudStack中KVM平台的Windows虚拟机默认磁盘类型为VirtIO

前言 本文的目的是为了解决在使用CloudStack(CloudPlatform)时,基于KVM虚拟化平台,Windows虚拟机的性能低下的问题. 此性能,主要指磁盘IO和网卡性能. 相关文档 由于CS文档中,只强调了PV这个概念,根据PV模式区分使用不同的硬件接口类型.所以收集部分链接给大家扫盲. 关于PV(Paravirtualization-半虚拟化)模式的概念,请参阅: http://www.rackspace.com/knowledge_center/article/choosing-

JQuery中trim函数的具体实现代码

由于Javascript 1.8.1 之前的版本,没有内置 trim 函数,所以 JQuery 对它有自己的实现.不同的JQuery版本,trim函数的实现也不尽相同. 阅读本文需要掌握正则表达式用法,如果不是很了解,建议阅读这个.鉴于正则表达式的强大用途(在各种语言如JS,Python,Ruby,Java中都会用到),建议重点学习并掌握. JQuery 1.7.2版本 // 截取的部分源码,不是完整语句,旨在说明实现过程 trimLeft = /^\s+/, trimRight = /\s+$

检测字符串中是否含有非法字符js代码

检测字符串中是否含有非法字符js代码:通常情况下,网站输入的字符串内容是需要经过检测的,因为有些字符带有一定的危险性,会对站点带来一定的危害,下面就介绍一下如何检测一个字符串是否含有非法字符,代码如下: function checks(str){ szMsg="[#_%&'\",;:=!^]"; alertStr=""; for(i=1;i<szMsg.length+1;i++){ if(str.indexOf(szMsg.substring

.Net Web产品中增加自己的功能和代码?

背景: 最近有一个项目,一个朋友找了一个网上比较成熟的CMS系统(动易),让我给他增加一些功能,这个产品功能挺多,但是没有源代码.按照以前的做法,就是直接反编译他的dll,生成源代码,然后在源代码的基础上修改和完善自己的功能.但是研究了一下这个产品,bin下面的DLL非常多,有主要的,还有辅助的.如果每个dll都反编译,简直不现实. ? 用发编译工具?ILSpy打开里面几个主要的dll,发现还加壳混淆了,用De4Dot反混淆出来.里面的代码还是非常清晰,但是如果每个dll都这样搞,岂不累死. ?

Objective-C中的多态、点语法和动态类型总结

一. 多态 1. 多态概念,定义 什么是多态:多态就是某一类事物的多种形态: 表现形式:  Animal *ani = [Dog new]; 多态条件:1.有继承关系     2.有方法的重写 2.多态代码实现: //实例化猫的对象 Animal *animal  = [Cat new]; //父类的指针指向子类对象: [animal eat]; //实例化狗的对象 animal = [Dog new]; //父类的指针指向子类对象. [animal eat]; 3.多态注意点: 1) 如果存在