使用编码安全措施来保护系统资源

ZDNet软件频道 时间:2002-07-30 作者:BUILDER.COM |  我要评论()
本文关键词:dotnet
在过去,系统的安全是依靠用户和用户所在组的权限设定来实现的。而在.NET中,Common Language Runtime (CLR)能够根据代码自身的特征来赋予程序访问系统资源的权限,而不是根据运行程序的用户权。
出于安全的原因,系统结构被迫在由Windows提供的用户界面或者由标准的Internet协议设计的系统之间做出选择。无论是Sun的Java应用程序,还是微软公司的ActiveX都不能提供一种结合安全与性能于一身,而且能够让用户与负责安全的官员也都满意的软件。这是由于传统的桌面操作系统允许在目标平台上进行编码操作来选择两个安全机制中的一个:在一个砂箱环境中,或者在一个用户允许的环境中执行。.NET框架允许开发者使用这两种机制,但是同时也增加了一种叫做编码访问安全的方法。

用这种方法,程序代码在目标平台上执行是基于一种预先确定的系统许可以及这个源程序本身上的。当Common Language Runtime装载一个可执行程序的时候,它会检查代码并且指定一个信任的级别来控制运行代码的访问到所有受保护的系统资源。这个级别的信任是相对于默认安全策略的,这个默认安全策略是作为已经安装的.NET框架结构的一部分。举个例子来说,默认安装政策定义了用来访问特定系统资源的CLR装载的集合。通过定义系统利用这些特性,在这种结构下可以制作出能让CLR自动的帮助保护用户系统里边的资源的应用软件。

代码访问安全可以保护些什么?

在.NET框架结构下你可以定义不同类的许可。其中包括对系统登录、环境变量、局部文件以及用户界面的不同许可。而且还有允许设计者控制程序来访问SQL (SQLClientPermission)或者OLE (OLEDBPermission) 数据库的能力,系统打印设备(PrintingPermission),创建或者接受TCP/IP连接(SocketPermission),甚至还包括对互联网访问的许可(WebPermission)。你需要对编码访问安全如何工作有所了解,这样才能够开始设计你的系统来实施安全保障。

程序代码访问安全的基础

如果你的程序代码试图访问一个受保护的系统资源,但是却没有经过许可,那么CLR的exception manager就会放出SecurityException。你可以使用try/catch/finally来处理这些exceptions。你也可以使用任意经过定义的类(e.g., WebPermission, SocketPermission, etc.)来控制对受保护的资源的运行时间。其中的每一种都包含了Deny 以及PermitOnly来对运行时间进行定义。

通过调用许可级别的Deny方式,CLR可以限制那些基于相关许可的对受保护系统资源的访问要求。为了删除Deny限制,你的程序代码要调用RevertDeny方式。为了定义哪些资源是不可以被访问的,你可以使用PermitOnly方式来指定哪些资源是该程序代码可以访问的。PermitOnly方式调用不能够授权超过当前级别的信任。举个例子来说,如果CLR决定某些来自互联网的程序代码对于在浏览器cache中的数据只有只读的权利,那么,你的程序就不能使用PermitOnly来访问当地的硬盘了。当我们使用PermitOnly的时候,只有那些被特定方式指定过的受保护资源在被访问的时候才不会引起CLR放出security exception。就像RevertDeny,RevertPermitOnly会取消之前调用PermitOnly所引起的效果。

决定许可边界范围

使用.NET框架结构开发出来的应用软件,就象是,当CLR最终执行了一串程序代码,并且试图访问受保护的资源的时候,实际的调用是在调用堆栈深处的。就这一点来说,CLR证实了序列中的每一个调用都有它所需的许可,通过这个许可来完成需求的操作。每一个在堆栈中的组件都有一个相联系的堆栈结构,其中包含了指定的信任级别。如果任何调用的组件没有必要的许可的话,那么就无法访问受保护的资源,那么这个操作就会失败,而且还会出现security exception。这也意味着CLR会在每一时间都经过堆栈。通过检查每一个组件的安全性,CLR可以避免被调用的组件使用调用它的那个级别的信任。

使用code access security特性需要有保持平衡以及性能的能力。何时、如何执行code access security,以及如何维护局部信任级别将会允许你能够更为准确的平衡这些需求。


责任编辑:炒饭

欢迎评论或投稿


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134