`
netxdiy
  • 浏览: 728694 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

SQL Server 2008中的代码安全(一):存储过程加密与安全上下文

 
阅读更多

SQL Server 2008中SQL应用系列--目录索引

最近对SQL Server 2008的安全入门略作小结,以作备忘。本文涉及两个应用:存储过程加密和安全上下文。

<一>存储过程加密

其实,用了这十多年的SQL server,我已经成了存储过程的忠实拥趸。在直接使用SQL语句还是存储过程来处理业务逻辑时,我基本会毫不犹豫地选择后者。

理由如下:

1、使用存储过程,至少在防非法注入(inject)方面提供更好的保护。至少,存储过程在执行前,首先会执行预编译,(如果由于非法参数的原因)编译出错则不会执行,这在某种程度上提供一层天然的屏障。

我至今还记得大约八、九年前采用的一个权限控制系统就是通过拼凑一个SQL语句,最终得到了一个形如“ where 1=1 and dataID in (1,2) and ModelID in (2,455) And ShopID in (111) and departID in ( 1,3) and ([Name] like %myword%) ”的where条件子句来获取符合条件的结果集。

注意:这个参数是通过地址栏web应用的地址栏或Winform的UI界面来输入的,所以对恶意注入需要花费一定的成本来维护。因为一些常用的关键字(或敏感词)很难区分是恶意或非恶意。

2、使用存储过程而不是直接访问基表,可以提供更好的安全性。你可以在行级或列级控制数据如何被修改。相对于表的访问,你可以确认有执行权限许可的用户执行相应的存储过程。这也是访问数据服务器的惟一调用途径。因此,任何偷窥者将无法看到你的SELECT语句。换句话说,每个应用只能拥有相应的存储过程来访问基表,而不是“SLEECT *”。

3、存储过程可以加密。(这点非常实用,设想一下,您的数据库服务器是托管的或租用的,你是否能心安理得的每天睡个安稳觉。如果竞争对手“一不小心”登上你的SQL Server,或通过注入得到了你的存储过程,然后相应的注入恶意的SQL,将您的业务逻辑乱改一通,而恰巧您五分钟前又没做备份,那会怎么样?)

(注意:加密存储过程前应该备份原始存储过程,且加密应该在部署到生产环境前完成。)

存储过程的加密非常简单,我们看一个例子:

插入测试表

插入存储过程:

未加密的存储过程:

邀月工作室

加密的存储过程:

邀月工作室

此时,至少,存储过程的内容不会被轻易看到(虽然解密也是有可能的)。应用这个,我们可以对某些关键的存储过程进行加密。但此时,存储过程仍然能被execute、alter和drop。

<二>安全上下文


除了加密sql文本的内容,我们还可以使用EXECUTE AS 子句设定存储过程的安全上下文,以满足不同的安全级别需求。

如果你对这些不感兴趣,请直接路过带下划线的段落。

(关于EXECUTE AS 子句的详细用法,请参看MSDN:http://msdn.microsoft.com/zh-cn/library/ms188354.aspx)

此处,我们需要了解的是:

1、在 SQL Server 中,可以定义以下用户定义模块的执行上下文:函数(内联表值函数除外)、过程、队列和触发器。

通过指定执行模块的上下文,可以控制数据库引擎使用哪一个用户帐户来验证对模块引用的对象的权限。这有助于人们更灵活、有力地管理用户定义的模块及其所引用对象所形成的对象链中的权限。必须而且只需授予用户对模块自身的权限,而无需授予用户对被引用对象的显式权限。只有运行模块的用户必须对模块访问的对象拥有权限。

针对函数、过程、队列和触发器,对应的参数也不同。存储过程对应的参数包括(CALLER | SELF | OWNER | 'user_name')。

CALLER 指定模块内的语句在模块调用方的上下文中执行。执行模块的用户不仅必须对模块本身拥有适当的权限,还要对模块引用的任何数据库对象拥有适当权限。 CALLER 是除队列外的所有模块的默认值,与 SQL Server 2005 行为相同。 CALLER 不能在 CREATE QUEUE 或 ALTER QUEUE 语句中指定。
SELF EXECUTE AS SELF 与 EXECUTE AS user_name 等价,其中指定用户是创建或更改模块的用户。创建或更改模块的用户的实际用户 ID 存储在 sys.sql_modulessys.service_queues 目录视图的 execute_as_principal_id 列中。SELF 是队列的默认值。
OWNER 指定模块内的语句在模块的当前所有者上下文中执行。如果模块没有指定的所有者,则使用模块架构的所有者。不能为 DDL 或登录触发器指定 OWNER。注意:OWNER 必须映射到单独帐户,不能是角色或组。
'user_name' 指定模块内的语句在 user_name 指定的用户的上下文中执行。将根据 user_name 来验证对模块内任意对象的权限。不能为具有服务器作用域的 DDL 触发器或登录触发器指定 user_name。请改用 login_name。user_name 必须存在于当前数据库中,并且必须是单独帐户。user_name 不能是组、角色、证书、密钥或内置帐户,如 NT AUTHORITY/LocalService、NT AUTHORITY/NetworkService 或 NT AUTHORITY/LocalSystem。执行上下文的用户 ID 存储在元数据中,可以在 sys.sql_modules 或 sys.assembly_modules 目录视图的 execute_as_principal_id 列查看。

2、所有权链具有以下限制:
仅适用于 DML 语句:SELECT、INSERT、UPDATE 和 DELETE。
调用和被调用对象的所有者必须相同。
不适用于模块内的动态查询。

我们看一个示例:
第一步、创建一个测试存储过程,用来delete表tb_Demo的所有数据

第二步:创建一个账号TonyZhang,并赋于该账号对该存储过程的exec权限

以该账号登录SQL Server,并执行:

注意:此时,虽然TonyZhang除了执行存储过程[CPP_DEL_ALL_Tb_Demo]之外没有任何其他权限,但仍然执行了存储过程,并删除了表记录。
如果我们修改存储过程为:

此时,再以TonyZhang登录,并执行存储过程,会提示:

邀月工作室
这是因为所有者权链只限定在SELECT、INSERT、UPDATE 和 DELETE。而不包括Truncate,换句话说,系统授于的Exec只既定于SELECT、INSERT、UPDATE 和 DELETE

有人可能会问:如果在存储过程内部调用动态语句,而不是明确的表名,我们如何限定权限呢?
第三步:我们建立一个存储过程,功能是传入一个参数表名,查询该表的记录数。

授于Tonyzhang 以执行该存储过程的权限:

此时,以Tonyzhang登录,执行存储过程,会提示:
邀月工作室
注意,此时,tonyzhang虽然有执行存储过程的权限,但是没有参数表的slect权限,所以执行失败。
第四步:修改存储过程的上下文
创建一个新账号jackwang,赋于表tb_Demo的select权限

修改存储的执行者

注意:这样,我们再调用存储过程[CPP_SEL_CountRowsFromAnyTable]时,会自动以JackWang的身份运行该存储过程。
此时,我们仍以Tonyzhang登录,再执行:
邀月工作室

小结:
本文通过简单的两个示例开始SQL server代码的安全之旅,
1、存储过程的加密,(注意:加密存储过程前应该备份原始存储过程,且加密应该在部署到生产环境前完成。)
2、存储过程的安全上下文。可以通过上下文设置更加严格的数据访问级别。(主要是对SELECT、INSERT、UPDATE 和 DELETE语句的访问限制)

后续部分将会涉及SQL server 2008新增的透明加密(TDE)功能。

邀月注:本文版权由邀月和CSDN共同所有,转载请注明出处。
助人等于自助! 3w@live.cn


分享到:
评论

相关推荐

    SQL Server 2008 面向数据库管理员的安全性概述白皮书

    《SQL Server 2008 面向数据库管理员的安全性概述》白皮书是针对SQL Server 2008数据库管理系统中安全性的详细指南,旨在帮助数据库管理员(DBA)理解和实施有效的安全策略,以保护数据资产免受未经授权的访问、修改...

    SQLSERVER存储过程大总结.doc

    SQL Server 存储过程是数据库管理系统中的一种重要功能,它允许开发者将一组复杂的SQL语句组合起来,形成一个可重用的代码单元。这个代码单元可以在需要时通过调用其名称来执行,大大提高了数据库操作的效率和代码的...

    以SQL Server 2000为例谈SQL Server数据库系统安全构建.pdf

    EMicrosoft”、“UDPSOLServer”、“IP=sqlserver2000Windows2000”、“IPIPSecsqlserverosqlserver2000saSQLServer***server”这些片段可能并不是SQL Server 2000准确的技术细节或术语,所以在撰写过程中需要根据上...

    SQL+server+客户端网络实用工具独立包

    SQL Server 客户端网络实用工具独立包是一个包含了一系列用于管理和诊断SQL Server网络连接的工具集合。这个包对于SQL Server数据库管理员来说极其重要,因为它提供了对数据库服务器远程访问的配置和故障排查能力。...

    sqlserver培训资料

    标签中提到的"ajax asp.net c# java xml"表明这套培训资料可能还包括了与这些技术集成的上下文,如使用ASP.NET进行Web应用程序开发,C#编程,Java应用,以及XML数据的处理和交换。 总的来说,这个培训资料集为学习...

    sql server术语学习表

    **定义**:`MSX`可能是指某个与SQL Server相关的技术或特性,但没有足够的上下文信息来明确其含义。 **用途**:不确定。 #### NChar (NChar数据类型) **定义**:`NChar`是一种固定长度的Unicode字符数据类型。 *...

    c#与SQL Server实现医院信息管理系统_HOSPITAL.rar

    《C#与SQL Server在医院信息管理系统中的应用》 C#和SQL Server是现代软件开发中常见的技术组合,尤其在企业级应用,如医院信息管理系统(HIS)中发挥着重要作用。C#作为.NET框架的主要编程语言,以其强大的类型...

    SQL SERVER 2005安全性操作手册

    ### SQL Server 2005安全性操作手册关键知识点解析...- **总结**:SQL Server 2005的安全性管理是一个综合性的过程,涉及多个方面的配置和监控。通过遵循上述最佳实践,可以显著提高系统的安全性,减少潜在的安全威胁。

    SQL_Server2005实现与维护(MCTS_教程)2

    根据提供的标题、描述以及部分上下文内容,我们可以推断出这份文档主要关注的是关于SQL Server 2005的实现与维护方面的知识。虽然提供的部分内容并没有包含具体的技术细节,但根据文档标题和描述,我们可以围绕SQL ...

    计算机软件-编程源码-pb代码备份sqlserver数据库.zip

    在本压缩包“计算机软件-编程源码-pb代码备份sqlserver数据库.zip”中,包含的是与编程和数据库管理相关的源代码,特别是针对SQL Server数据库的备份操作。这里我们将深入探讨涉及的知识点。 首先,"pb"通常指的是...

    C# 数据库系统开发 案例精选 光盘源文件附带sqlserver2005数据库文件

    在本资源中,"C# 数据库系统开发 案例精选 光盘源文件附带sqlserver2005数据库文件" 提供了一系列关于使用C#语言进行数据库系统开发的实战案例,其中包括了源代码和配套的SQL Server 2005数据库文件。这个压缩包显然...

    sql2008完整版.txt

    SQL Server 2008是微软公司推出的一款关系型数据库管理系统,它提供了强大的数据存储、处理和分析能力。SQL Server 2008支持多种数据类型,并且具备高度的可扩展性和安全性,是企业和组织构建稳定可靠的数据库应用的...

    sql2000解密

    在SQL Server 2000中,WITH ENCRYPT选项用于创建加密的存储过程、视图、函数等数据库对象。加密可以保护敏感代码不被未经授权的用户查看或修改,增加了数据库的安全性。但有时,由于种种原因,我们可能需要对已加密...

    SQL Server数据库的访问安全研究 (1).pdf

    SQL Server是微软公司开发的一款关系型数据库管理系统,广泛应用于企业级数据存储和管理。文章中作者黄洋指出,数据库安全是一个极为重要的议题,特别是在当今信息时代,数据的保密性、完整性和可用性是企业与组织...

    SQL Server用法总结.docx

    9. **其他高级特性**:存储过程还可以使用 `WITH RECOMPILE`(每次执行时重新编译)、`EXECUTE AS`(指定执行上下文)等选项,提供更高的灵活性和安全性。 以上只是SQL Server的一部分功能,实际上它还包括触发器、...

    C#、SQL Server 写的QQ

    【标题】"C#、SQL Server 写的QQ"揭示了一个项目,它是使用C#编程语言和SQL Server数据库管理系统开发的一个即时通讯应用,类似于腾讯的QQ。这个项目可能旨在学习和实践C#的网络编程、多线程以及数据库操作等技能。 ...

    ASP.NET 2.0+SQL Server 2005全程指南-源代码

    ASP.NET 2.0+SQL Server 2005全程指南 目录 基础篇 第1章 ASP.NET概述及环境配置 1.1 认识ASRNET 1.1.1 .NET Framework框架 1.1.2 ASP.NET功能与特性 1.1.3 ASP.NET与ASP的区别 1.2 搭建ASP.NET开发环境 1.2.1...

    SQLPrompt6.5.rar

    在安装过程中,用户需要确保满足Sql Server 2008 R2的系统需求,并按照步骤进行操作,以确保软件能正确安装并与数据库环境兼容。 SQL.Prompt.Keygen.exe则是一个密钥生成工具,用于生成激活SQLPrompt所需的序列号。...

    RedGate SQL插件

    它能理解T-SQL语法,并根据上下文提供相关的表名、字段名、函数和存储过程建议。 2. **版本控制集成**: 对于团队协作,插件支持与常见的版本控制系统如Git、SVN等集成,使得数据库脚本的版本管理和历史跟踪变得...

Global site tag (gtag.js) - Google Analytics