C#代码安全性.docx
- 文档编号:3753578
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:12
- 大小:19.40KB
C#代码安全性.docx
《C#代码安全性.docx》由会员分享,可在线阅读,更多相关《C#代码安全性.docx(12页珍藏版)》请在冰豆网上搜索。
C#代码安全性
C#强化系列文章九:
代码访问安全性使用
在.NetFramework中提供了代码访问安全性(CodeAccessSecurity),它的主要作用就是限制代码的使用权限。
可以控制各种系统资源的访问权限、可以要求代码的调用方拥有特定的权限......。
比如我们可以控制自己的dll只能在什么条件下由什么人调用,特别是在A中可以限制不同代码的安全权限,从源头限制住网络上的攻击等。
本文的主要内容如下:
1、在Asp.Net中使用自定义的信任级别
2、配置Sqlconnection的代码访问权限
3、实现和使用一个最简版的自定义权限
在Asp.Net中使用自定义的信任级别
Asp.Net默认在C:
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG\web.config中配置了网站的信任级别:
默认为Full,表示拥有最大的权限,当然风险也就最高,我们可以在自己的网站下的web.config中自定义信任级别:
\_NetProject\PermissionTrust\WebSite11\web_customtrust.config"/> 这里使用了自定义的配置文件,其实也就是复制C: \WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG\web_lowtrust.config文件,然后在此文件上进行适当修改就可以了(使用此配置默认是不允许连接数据库的) 配置Sqlconnection的代码访问权限 配置的方法就是修改自定义的web_customtrust.config文件,修改后的文件如下所示: 粗体部分为修改点 web_customtrust.config class="NamedPermissionSet" version="1" Unrestricted="true" Name="FullTrust" Description="Allowsfullaccesstoallresources" /> class="NamedPermissionSet" version="1" Name="Nothing" Description="Deniesallresources,includingtherighttoexecute" /> class="NamedPermissionSet" version="1" Name="ASP.Net"> class="AspNetHostingPermission" version="1" Level="High" /> class="FileIOPermission" version="1" Read="$AppDir$" PathDiscovery="$AppDir$" /> class="IsolatedStorageFilePermission" version="1" Allowed="AssemblyIsolationByUser" UserQuota="1048576" /> class="SecurityPermission" version="1" Flags="Execution" /> KeyRestrictions="UserID=;Password=;ConnectionReset=" KeyRestrictionBehavior="AllowOnly"/> class="FirstMatchCodeGroup" version="1" PermissionSetName="Nothing"> class="AllMembershipCondition" version="1" /> class="UnionCodeGroup" version="1" PermissionSetName="ASP.Net"> class="UrlMembershipCondition" version="1" Url="$AppDirUrl$/*" /> class="UnionCodeGroup" version="1" PermissionSetName="ASP.Net"> class="UrlMembershipCondition" version="1" Url="$CodeGen$/*" /> class="ZoneMembershipCondition" version="1" Zone="MyComputer"/> class="UnionCodeGroup" version="1" PermissionSetName="FullTrust" Name="Microsoft_Strong_Name" Description="ThiscodegroupgrantscodesignedwiththeMicrosoftstrongnamefulltrust."> class="StrongNameMembershipCondition" version="1" PublicKeyBlob="002400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293" /> class="UnionCodeGroup" version="1" PermissionSetName="FullTrust" Name="Ecma_Strong_Name" Description="ThiscodegroupgrantscodesignedwiththeECMAstrongnamefulltrust."> class="StrongNameMembershipCondition" version="1" PublicKeyBlob="00000000000000000400000000000000" /> 加入以上的配置后限制使用SqlConnection时只能访问dbserver上的db1数据库,不能访问其他数据库,用户名密码等可以自由输入,也就是在代码中只能: SqlConnectionconnection=newSqlConnection("datasource=dbserver;UserID=gspring;Password=***;initialcatalog=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创建一个权限,该权限是当前权限与指定权限的并集。 1usingSystem; 2usingSystem.Text; 3usingSystem.Security; 4usingSystem.Security.Permissions; 5 6namespaceMyPermission 7{ 8[Serializable] 9publicsealedclassCustomPermission: CodeAccessPermission,IUnrestrictedPermission 10{ 11privateDateTime_expiredDate; 12 13publicDateTimeExpiredDate 14{ 15get{return_expiredDate;} 16set{_expiredDate=value;} 17} 18 19publicCustomPermission() 20{ 21} 22 23//必须有这个方法,CAS系统会调用此方法的 24publicCustomPermission(PermissionStatestate) 25{ 26} 27 28publicboolIsUnrestricted() 29{ 30returnfalse; 31} 32 33publicoverrideIPermissionCopy() 34{ 35CustomPermissioncopy=newCustomPermission(); 36copy.ExpiredDate=this.ExpiredDate; 37 38returncopy; 39} 40 41publicoverrideIPermissionIntersect(IPermissiontarget) 42{ 43if(null==target) 44{ 45returnnull; 46} 47else 48{ 49returntarget; 50} 51} 52 53privateboolCheckDate(DateTimedate) 54{ 55if(System.DateTime.Now.CompareTo(date)<0) 56{ 57returntrue; 58} 59else 60{ 61returnfalse; 62} 63} 64 65/**//// 66///进行权限判断 67/// 68/// 69/// 70publicoverrideboolIsSubsetOf(IPermissiontarget) 71{ 72if(null==target) 73{ 74returnfalse;//为false时,指示条件不满足,需要读取config中配置来判断 75} 76try 77{ 78CustomPermissionpassedpermission=(CustomPermission)target; 79 80returnCheckDate(passedpermission.ExpiredDate); 81} 82catch(InvalidCastException) 83{ 84thrownewArgumentException("Argument_WrongType",this.GetType().FullName); 85} 86} 87 88publicoverridevoidFromXml(SecurityElementPassedElement) 89{ 90stringelement=PassedElement.Attribute("expireddate"); 91 92if(null! =element) 93{ 94this.ExpiredDate=Convert.ToDateTime(element); 95} 96} 97 98publicoverrideSecurityElementToXml() 99{ 100SecurityElementelement=newSecurityElement("IPermission"); 101Typetype=this.GetType(); 102StringBuilderAssemblyName=newStringBuilder(type.Assembly
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 代码 安全性
![提示](https://static.bdocx.com/images/bang_tan.gif)