C#代码安全性.doc_第1页
C#代码安全性.doc_第2页
C#代码安全性.doc_第3页
C#代码安全性.doc_第4页
C#代码安全性.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C#强化系列文章九:代码访问安全性使用在.Net Framework中提供了代码访问安全性(Code Access Security),它的主要作用就是限制代码的使用权限。可以控制各种系统资源的访问权限、可以要求代码的调用方拥有特定的权限.。比如我们可以控制自己的dll只能在什么条件下由什么人调用,特别是在A中可以限制不同代码的安全权限,从源头限制住网络上的攻击等。本文的主要内容如下:1、在Asp.Net中使用自定义的信任级别2、配置Sqlconnection的代码访问权限3、实现和使用一个最简版的自定义权限 在Asp.Net中使用自定义的信任级别 Asp.Net默认在C:WINDOWSMicrosoft.NETFrameworkv2.0.50727CONFIGweb.config中配置了网站的信任级别: 默认为Full,表示拥有最大的权限,当然风险也就最高,我们可以在自己的网站下的web.config中自定义信任级别: 这里使用了自定义的配置文件,其实也就是复制C:WINDOWSMicrosoft.NETFrameworkv2.0.50727CONFIGweb_lowtrust.config文件,然后在此文件上进行适当修改就可以了(使用此配置默认是不允许连接数据库的 )配置Sqlconnection的代码访问权限 配置的方法就是修改自定义的web_customtrust.config文件,修改后的文件如下所示:粗体部分为修改点 web_customtrust.config 加入以上的配置后限制使用SqlConnection时只能访问dbserver上的db1数据库,不能访问其他数据库,用户名密码等可以自由输入,也就是在代码中只能: SqlConnection connection = new SqlConnection( data source=dbserver;User ID=gspring;Password=*;initial catalog=db1 ) 如果连接其他数据库就会报错: 说明: 应用程序试图执行安全策略不允许的操作。要授予此应用程序所需的权限,请与系统管理员联系,或在配置文件中更改该应用程序的信任级别。 异常详细信息: System.Security.SecurityException: 请求“System.Data.SqlClient.SqlClientPermission, System.Data, Version = 2.0 . 0.0 , Culture = neutral, PublicKeyToken = b77a5c561934e089”类型的权限已失败。 这样就从源头上限制住了数据库的连接操作。当然如果希望可以连接任意数据库,可以修改为如下配置: 实现和使用一个最简版的自定义权限 自定义一个代码访问权限需要从CodeAccessPermission继承,并且要实现IUnrestrictedPermission接口,主要需实现的方法有:Copy 创建当前权限对象的副本。Intersect 返回当前类与传递的类所允许权限的交集。IsSubsetOf 如果传递的权限包括当前权限允许的一切操作,则 IsSubsetOf 返回 true。FromXml 对您的自定义权限的 XML 表示形式进行解码。ToXml 对您的自定义权限的 XML 表示形式进行编码。Union 创建一个权限,该权限是当前权限与指定权限的并集。 1 using System; 2 using System.Text; 3 using System.Security; 4 using System.Security.Permissions; 5 6 namespace MyPermission 7 8 Serializable 9 public sealed class CustomPermission : CodeAccessPermission, IUnrestrictedPermission 10 11 private DateTime _expiredDate; 12 13 public DateTime ExpiredDate 14 15 get return _expiredDate; 16 set _expiredDate = value; 17 18 19 public CustomPermission() 20 21 22 23 / 必须有这个方法,CAS系统会调用此方法的 24 public CustomPermission(PermissionState state) 25 26 27 28 public bool IsUnrestricted() 29 30 return false ; 31 32 33 public override IPermission Copy() 34 35 CustomPermission copy = new CustomPermission(); 36 copy.ExpiredDate = this .ExpiredDate; 37 38 return copy; 39 40 41 public override IPermission Intersect(IPermission target) 42 43 if ( null = target) 44 45 return null ; 46 47 else 48 49 return target; 50 51 52 53 private bool CheckDate(DateTime date) 54 55 if (System.DateTime.Now.CompareTo(date) 0 ) 56 57 return true ; 58 59 else 60 61 return false ; 62 63 64 65 /*/ / 66 / 进行权限判断 67 / 68 / 69 / 70 public override bool IsSubsetOf(IPermission target) 71 72 if ( null = target) 73 74 return false ; / 为false时,指示条件不满足,需要读取config中配置来判断 75 76 try 77 78 CustomPermission passedpermission = (CustomPermission)target; 79 80 return CheckDate(passedpermission.ExpiredDate); 81 82 catch (InvalidCastException) 83 84 throw new ArgumentException( Argument_WrongType , this .GetType().FullName); 85 86 87 88 public override void FromXml(SecurityElement PassedElement) 89 90 string element = PassedElement.Attribute( expireddate ); 91 92 if ( null != element) 93 94 this .ExpiredDate = Convert.ToDateTime(element); 95 96 97 98 public override SecurityElement ToXml() 99 100 SecurityElement element = new SecurityElement( IPermission );101 Type type = this .GetType();102 StringBuilder AssemblyName = new StringBuilder(type.Assembly.ToString();103 AssemblyName.Replace( , ); 104 element.AddAttribute( class , type.FullName + , + AssemblyName);105 element.AddAttribute( version , 1 );106 element.AddAttribute( expireddate , this .ExpiredDate.ToString();107 return element;108 109 110 例子比较简单,就是读取配置中的过期时间进行判断,需要特别说明的地方有:1、public CustomPermission(PermissionState state)这个构造函数必须要有,CAS内部会调用此方法2、将程序集添加到受信任的程序集列表中,因为自定义权限将参与 .NET Framework 安全系统,所以它必须完全受信任。依次执行以下命令:caspol -rf MyPermission.dll -从策略级别移除完全信任程序集gacutil -i MyPermission.dll -注册GACcaspol -af MyPermission.dll -将完全信任程序集添加到策略级别3、在将程序集加入GAC之后,会默认从GAC中读取dll信息,不会读取当前项目下新生成的dll,需要从GAC中把此DLL删除后才可以。ps:我当时在CustomPermission里面加入一个新的方法,结果在自己的网站下一直找不到,把GAC中的信息删除之后才能找到,不知道算不算VS2005的一个Bug4、在MyPermission程序集的AssemblyInfo.cs文件中添加配置: assembly: AllowPartiallyTrustedCallers 要不然会报粗:该程序集不支持部分受信任的调用方 5、在web_customtrust.config文件中加入配置 a、在SecurityClasses节点加入: b、在Name=ASP.Net的PermissionSet节点加入: 配置好之后就可以在代码中应有此安全策略了 private void Test() CustomPermission Perm = new CustomPermission(); Perm.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论