SQL Server2005SQLCLR代码安全之权限
2007-11-11 10:00:25 来源:WEB开发网核心提示:·瑞星病毒监测报告(2005.12.12-2005.1·安装指南:sql server(WINDOWS平台上强大的数据库平台) 2005安装及界面·使用VS2005打造简单分页浏览器·快下载:微软免费提供VB2005电子书·三分钟学会打字,神奇数字五
- ·瑞星病毒监测报告(2005.12.12-2005.1
·安装指南:sql server(WINDOWS平台上强大的数据库平台) 2005安装及界面
·使用VS2005打造简单分页浏览器
·快下载:微软免费提供VB2005电子书
·三分钟学会打字,神奇数字五笔2005.1
·体验另类的微软MCE2005
·教你用WPS2005演示制作播放按钮
·SQLServer 2005安装及界面截图,
·SQL 2005的SSIS与Oracle(大型网站数据库平台)的迁移性能
·VS.NET2005 Beta2初体验
当你使用CREATE ASSEMBLY语句把一个程序集加载到一个数据库中时,sql server(WINDOWS平台上强大的数据库平台)提供了三种权限集级别:SAFE,EXTERNAL_ACCESS和UNSAFE。这些权限集形成如图3和图5(均请参考第二篇)所示的AppDomain策略级别。
下面是一个典型的语句,它实现安装位于FileLoader.dll文件内的一个程序集,并且赋予它EXTERNAL_ACCESS权限集。
CREATE ASSEMBLY FileAccess FROM 'E:\FileLoader.dll' WITH PERMISSION_SET = EXTERNAL_ACCESS GO |
在代码执行时,每一种权限集级别都授予该代码一组不同的CAS许可权集。下面让我们开始讨论在每一级上授予的特定许可权。
(1) SAFE
SAFE是默认的权限集。它仅授予足够的许可权来执行代码,实现不要求存取外部资源的内部计算以及存取在宿主sql server(WINDOWS平台上强大的数据库平台)实例中的数据和对象。注意,SAFE代码不能存取外部的资源,因此它不能读取或写磁盘文件,不能存取任何其它sql server(WINDOWS平台上强大的数据库平台)实例,或读取或写注册表。而且,该代码也必须被检验为类型安全的,这将有助于避免各种包括缓冲区溢出在内的攻击。
SAFE代码是更可靠和安全的SQLCLR代码。它能够实现用T-SQL书写的代码在数据库和服务器实例内所能实现的几乎一样的功能。它能够授予如表格1所列举的CAS许可权。从表格1中可见,该代码能够运行和读取宿主sql server(WINDOWS平台上强大的数据库平台)实例中的对象和数据-借助于一种特定形式的ADO.NET连接串,或者是"context connection=true"或者是"context connection=yes"来实现。任何其它连接串都可能会导致某种安全异常。
表格1:授予给SAFE程序集的权限集。
权限 | 类型 | 限制 |
SecurityPermission | 受限制 | 执行 |
SqlClientPermission | 受限制 | 不能是空口令,只能使用上下文连接串 |
授予给一个程序集的结果权限集是列举于表格1中的许可权权限集与来自企业、机器和用户权限集的交集。因为这些级别默认会拥有所有的许可权,所以程序集仅接受列举于表格1中的权限。注意,请确保你一定要理解这些权限。
(2) EXTERNAL_ACCESS
与SAFE相比,EXTERNAL_ACCESS权限集允许有限制地存取存在于sql server(WINDOWS平台上强大的数据库平台)实例外部的资源-包括磁盘文件,在其它sql server(WINDOWS平台上强大的数据库平台)实例中的数据和对象,环境变量和注册表的一些部分。存取这些其它资源通常是在sql server(WINDOWS平台上强大的数据库平台)服务帐户的安全上下文中进行的,但是,该代码能够模拟其它用户进行存取。这个级别授予列举于表格2中的许可权。
表格2:授予给EXTERNAL_ACCESS程序集的权限集。
权限 | 类型 | 限制 |
EnviromentPermission | 不受限制 | - |
FileIOPermission | 不受限制 | - |
RegistryPermission | 受限制 | 仅能以读方式存取HKEY_CLASSES_ROOT,HKEY_LOCAL_MACHINE,HKEY_CURRENT_USER,HKEY_CURRENT_CONFIG和HKEY_USER |
SecurityPermission | 受限制 | Assertion,Execution,SerializationFormatter,ControlPrincipal |
KeyContainerPermission | 不受限制 | - |
SqlClientPermission | 不受限制 | - |
EventLogPermission | 受限制 | 仅限于本地主机且仅限于系统管理员 |
DnsPermission | 不受限制 | - |
SocketPermission | 受限制 | 仅限于IP地址 |
WebPermission | 受限制 | 仅能通过HTTP存取本地主机 |
SmtpPermission | 受限制 | 仅能进行连接存取 |
DistributedTransactionPermission | 不受限制 | - |
NetworkInformationPermission | 受限制 | 仅能通过Ping方式存取 |
StorePermission | 不受限制 | - |
上面不受限制的FileIOPermission可能看起来有点令人担心,因为,它意味着,从CLR的角度来看,代码能存取磁盘上的任何位置。但是切记,该代码仍然运行于本地服务帐户的操作系统安全限制下。因此如果该帐户不能存取一个文件的话,那么SQLCLR代码也不能存取。
典型地,本地服务帐户是一种具有极强权限的帐户,因此存在滥用的可能性。为此,我们一般把对这些程序集的存取权限仅授予那些具有服务帐户信任度的登录并且不使用本地系统帐户作为sql server(WINDOWS平台上强大的数据库平台)的服务帐户。
值得注意的是,借助于EXTERNAL_ACCESS权限集,你可以使用一个更传统型的ADO.NET连接串来连接到在同一个sql server(WINDOWS平台上强大的数据库平台)实例(SQLCLR代码在其中运行)中的一个数据库。这需要SqlClientPermission以便你能够使用一个除了"上下文连接"串以外的连接-用以读取当前实例中的数据,指定通常的服务器命名,凭证,等等。然而,我也无法找到为什么你要这样做的理由,但是既然我们可以进行选择,也是一件好事,对吗?
(3) UNSAFE
这个UNSAFE权限集是赋予所有权限的SQLCLR等价物,在这种情况下,CLR挂起所有的许可权检查。它接受单个的不受限制的SecurityPermission权限,这是CLR的授予所有权限的方式。
潜在地,一个UNSAFE程序集能够完成各种"危险性"的动作,因为它属于内在地被信任的代码。例如,它能调用非托管代码,例如COM组件和原始Win32 API。它还受限于服务帐户的操作系统许可权,但是CLR不会限制它存取任何资源的能力。
因为UNSAFE是如此的不安全,所以,只有一个sysadmin能够创建这种类型的程序集。
Tags:SQL ServerSQLCLR 代码
编辑录入:coldstar [复制链接] [打 印]- ››SQL Server 2008 R2 下如何清理数据库日志文件
- ››sqlite 存取中文的解决方法
- ››SQL2005、2008、2000 清空删除日志
- ››SQL Server 2005和SQL Server 2000数据的相互导入...
- ››sql server 2008 在安装了活动目录以后无法启动服...
- ››sqlserver 每30分自动生成一次
- ››sqlite 数据库 对 BOOL型 数据的插入处理正确用法...
- ››sql server自动生成批量执行SQL脚本的批处理
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
更多精彩
赞助商链接