好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

SQLServer2005SQLCLR代码之CLR安全

一、 CLR 安全 性 在 第一篇 中,我们已经讨论了宿主于和在SQL Server内执行的.NET 代码 的 安全 环境-从SQL Server的角度来观察SQLCLR 代码 模块。但是CLR使用其自己的 安全 模型。一旦SQL Server同意进行所有的许可权检查并且允许 代码 执行,那么这种模型

  一、 CLR 安全 性

  在 第一篇 中,我们已经讨论了宿主于和在SQL Server内执行的.NET 代码 的 安全 环境-从SQL Server的角度来观察SQLCLR 代码 模块。但是CLR使用其自己的 安全 模型。一旦SQL Server同意进行所有的许可权检查并且允许 代码 执行,那么这种模型就会"强制介入"。仅仅因为它能够执行并不意味着它能够做它想做的任何事情。

  CLR提供给它运行的.NET 代码 和它运行的主机许多服务。这些服务包括:

  1)类型 安全 检查-校验 代码 能够以良好定义的方式来存取内存结构;

  2)基于角色的 安全 -根据由谁运行 代码 ;

  3) 代码 存取 安全 -在这种情况下,许可权的授予是基于 代码 特征而不是基于谁在运行 代码 ;

  4)应用程序域-它提供在宿主进程中实现 安全 执行地带。

  在数据库中的所有具有相同所有者的程序集都被加载到同一个AppDomain中,不管它们被安装到哪个数据库中。在一个AppDomain中的每一个程序集都能够通过反射找到另外每一个其它程序集。既然它们具有相同的所有者,所以SQL Server不必执行它自己的权限检查,这有助于性能的改进。但是这些措施并不能解决实际存在的 代码 存取 安全 问题。

  CLR还强制实行宿主保护属性(HPA)-允许一个宿主(在此情况下,是指SQL Server)控制允许SQLCLR 代码 使用.NET框架的指定部分。其实,在可靠性方面,还有除了 安全 性外的其它方面的内容。

  二、 代码 存取 安全 性

  CLR提供的最重要的服务之一是 代码 存取 安全 性(CAS)。CAS的基本原则是,为 代码 赋予特权,而不是针对用户。如果你已习惯于Windows或SQL Server模式的把许可权赋予用户和登录而不是它们正在执行的 代码 ,这听上去似乎有些奇怪。但是,就算SQLCLR 代码 在一个管理用户的 安全 上下文下执行,它也可能不具有所有可用的许可权。事实上,在SQL Server内部执行的SQLCLR 代码 几乎一定不会拥有所有许可权-这称为"完全信任"。

  下面是一些有关于CAS工作的基本知识。当加载一个程序集以响应一个SQLCLR存储过程、函数或其它 代码 模块的调用时,由CLR负责搜集证据。它使用该证据来把该程序集指派给一个或多个 代码 组。每一个被指派的 代码 组都有一个通过某种运行时刻 安全 策略(使用会员条件来决定 代码 被指派到哪里)指派的权限集。一种权限相应于操作被保护的内容的一种权力。总之, 代码 要求调用者必须拥有某种许可权才可以执行特定的行为。

  如果这些对于你来说都是陌生概念,那么你需要首先对开发 安全 的应用程序的这些极其重要的部分有个透彻了解为好。而且,对于理解SQLCLR 代码 在执行时所具有的许可权来说,理解CAS是最关键的。

  那么,SQL Server是如何把SQL Server和CLR 安全 环境融合到一起的呢?要理解的第一事情是,这些系统保护着两个资源集合。第一个集合包含SQL Server对象和数据。SQL Server的 安全 环境保护对它自己的对象的存取,甚至包括对它所宿主的SQLCLR 代码 的保护。

  CLR保护对于其它一切的存取。这"其它一切"是指什么呢?是指在SQL Server实例外部的资源,包括磁盘文件、注册表设置、其它的数据库、网络资源和Web服务。这意味着,对于保护在它的宿主SQL Server实例内的任何内容来说,CAS什么也没有做。

  现在,让我们稍作停顿再作进一步考虑。让我们先搞明白,哪种 安全 系统保护哪些关键内容。当然,我们也可以用另一种方式来描述同样的事情:在SQL Server内授予的许可权保护它的所有的数据和对象以免为任何类型的执行 代码 所调用,而不管这些 代码 是用T-SQL或是用SQLCLR编写。CLR的CAS保护对于SQL Server外部所有资源的存取。

  这样以来,一个必然的结论就是:对于保护一个SQL Server实例的对象或数据来说,CAS什么也不没有做。

查看更多关于SQLServer2005SQLCLR代码之CLR安全的详细内容...

  阅读:39次