SQL Server 2008中的代码安全之一:存储过程安全上下文
2011-09-23 15:42
477 查看
除了加密sql文本的内容,我们还可以使用EXECUTE AS 子句设定存储过程的安全上下文,以满足不同的安全级别需求。(关于EXECUTE AS 子句的详细用法,请参看MSDN:http://msdn.microsoft.com/zh-cn/library/ms188354.aspx) 此处,我们需要了解的是:
1、在 SQL Server 中,可以定义以下用户定义模块的执行上下文:函数(内联表值函数除外)、过程、队列和触发器。
通过指定执行模块的上下文,可以控制数据库引擎使用哪一个用户帐户来验证对模块引用的对象的权限。这有助于人们更灵活、有力地管理用户定义的模块及其所引用对象所形成的对象链中的权限。必须而且只需授予用户对模块自身的权限,而无需授予用户对被引用对象的显式权限。只有运行模块的用户必须对模块访问的对象拥有权限。
针对函数、过程、队列和触发器,对应的参数也不同。存储过程对应的参数包括(CALLER | SELF | OWNER | 'user_name')。
2、所有权链具有以下限制:仅适用于 DML 语句:SELECT、INSERT、UPDATE 和 DELETE。调用和被调用对象的所有者必须相同。 不适用于模块内的动态查询。
我们看一个示例: 第一步、创建一个测试存储过程,用来delete表tb_Demo的所有数据
此时,再以TonyZhang登录,并执行存储过程,会提示:
这是因为所有者权链只限定在SELECT、INSERT、UPDATE 和 DELETE。而不包括Truncate,换句话说,系统授于的Exec只既定于SELECT、INSERT、UPDATE
和 DELETE 有人可能会问:如果在存储过程内部调用动态语句,而不是明确的表名,我们如何限定权限呢? 第三步:我们建立一个存储过程,功能是传入一个参数表名,查询该表的记录数。
此时,以Tonyzhang登录,执行存储过程,会提示:
注意,此时,tonyzhang虽然有执行存储过程的权限,但是没有参数表的select权限,所以执行失败。第四步:修改存储过程的上下文 创建一个新账号jackwang,赋于表tb_Demo的select权限
注意:这样,我们再调用存储过程[CPP_SEL_CountRowsFromAnyTable]时,会自动以JackWang的身份运行该存储过程。此时,我们仍以Tonyzhang登录,再执行:
小结: 本文通过简单的两个示例开始SQL server代码的安全之旅, 1、存储过程的加密,(注意:加密存储过程前应该备份原始存储过程,且加密应该在部署到生产环境前完成。)2、存储过程的安全上下文。可以通过上下文设置更加严格的数据访问级别。(主要是对SELECT、INSERT、UPDATE 和 DELETE语句的访问限制)
1、在 SQL Server 中,可以定义以下用户定义模块的执行上下文:函数(内联表值函数除外)、过程、队列和触发器。
通过指定执行模块的上下文,可以控制数据库引擎使用哪一个用户帐户来验证对模块引用的对象的权限。这有助于人们更灵活、有力地管理用户定义的模块及其所引用对象所形成的对象链中的权限。必须而且只需授予用户对模块自身的权限,而无需授予用户对被引用对象的显式权限。只有运行模块的用户必须对模块访问的对象拥有权限。
针对函数、过程、队列和触发器,对应的参数也不同。存储过程对应的参数包括(CALLER | SELF | OWNER | 'user_name')。
2、所有权链具有以下限制:仅适用于 DML 语句:SELECT、INSERT、UPDATE 和 DELETE。调用和被调用对象的所有者必须相同。 不适用于模块内的动态查询。
我们看一个示例: 第一步、创建一个测试存储过程,用来delete表tb_Demo的所有数据
USE master GO CREATE LOGIN TonyZhang WITH PASSWORD = '123b3b4' USE testDb2 GO CREATE USER TonyZhang GO GRANT EXEC ON dbo.[CPP_DEL_ALL_Tb_Demo] to TonyZhang以该账号登录SQL Server,并执行:
Alter PROCEDURE dbo.[CPP_DEL_ALL_Tb_Demo] AS -- Deletes all rows prior to the data feed truncate table dbo.[tb_Demo] GO
此时,再以TonyZhang登录,并执行存储过程,会提示:
这是因为所有者权链只限定在SELECT、INSERT、UPDATE 和 DELETE。而不包括Truncate,换句话说,系统授于的Exec只既定于SELECT、INSERT、UPDATE
和 DELETE 有人可能会问:如果在存储过程内部调用动态语句,而不是明确的表名,我们如何限定权限呢? 第三步:我们建立一个存储过程,功能是传入一个参数表名,查询该表的记录数。
GRANT EXEC ON dbo.[CPP_SEL_CountRowsFromAnyTable] to TonyZhang go
此时,以Tonyzhang登录,执行存储过程,会提示:
注意,此时,tonyzhang虽然有执行存储过程的权限,但是没有参数表的select权限,所以执行失败。第四步:修改存储过程的上下文 创建一个新账号jackwang,赋于表tb_Demo的select权限
alter PROCEDURE dbo.[CPP_SEL_CountRowsFromAnyTable] @SchemaAndTable nvarchar(255) WITH EXECUTE AS 'JackWang' AS EXEC ('SELECT COUNT(1) FROM ' + @SchemaAndTable) GO
注意:这样,我们再调用存储过程[CPP_SEL_CountRowsFromAnyTable]时,会自动以JackWang的身份运行该存储过程。此时,我们仍以Tonyzhang登录,再执行:
小结: 本文通过简单的两个示例开始SQL server代码的安全之旅, 1、存储过程的加密,(注意:加密存储过程前应该备份原始存储过程,且加密应该在部署到生产环境前完成。)2、存储过程的安全上下文。可以通过上下文设置更加严格的数据访问级别。(主要是对SELECT、INSERT、UPDATE 和 DELETE语句的访问限制)
相关文章推荐
- SQL Server 2008中的代码安全(一):存储过程加密与安全上下文
- SQL Server 2008中的代码安全(一):存储过程加密与安全上下文
- SQL Server 2008中的代码安全(一):存储过程加密与安全上下文
- 浅析SQL Server 2008中的代码安全之一:存储过程加密
- SQLServer 2008中的代码安全 存储过程加密与安全上下文
- sql server 2005 (2008)能成功删除系统存储过程以实现安全配置吗?
- SQL Server 2008查看死锁的存储过程的代码示例
- 使用sql server的存储过程来讲中文汉字转化为拼音字符的代码实例教程
- SQL Server 分页查询存储过程代码
- SQL Server 2008中的代码安全(五):非对称密钥加密
- SQL SERVER 2008破解加密存储过程(修正存储过程过长解密出来是空白的问题)
- Visual C# 2008+SQL Server 2005 数据库与网络开发--4.6.1 存储过程简介
- Delphi 调用SQL Server 2008存储过程
- SQL Server 2008中的代码安全(三):通过PassPhrase加密
- SQL Server 2008中的代码安全之二:DDL触发器与登录触发器
- 在数据库SQL Server 2005/2008中,查询包含某关键字的存储过程语句:
- 在存储过程中编写正确的事务处理代码(SQL Server 2000 & 2005)
- SQL Server 2008中的代码安全(四):主密钥
- 在存储过程中编写正确的事务处理代码(SQL Server 2000 & 2005)
- SQL Server 2008之存储过程的设计和实现