关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » SQL Server »浅析SQL Server 2008中的代码安全之一:存储过程加密与安全上下

    浅析SQL Server 2008中的代码安全之一:存储过程加密与安全上下

    2011-02-28 15:46:00 出处:ITJS
    分享

    最近对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,将您的业务逻辑乱改一通,而恰巧您五分钟前又没做备份,那会怎么样?)

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

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

    插入测试表

    use testDb2  go  /**********测试表*****************/  SET ANSI_PADDING ON GO  CREATE TABLE [dbo].[tb_demo](      [id] [int] NOT NULL,      [submitdate] [datetime] NULL,      [commment] [nvarchar](200) NULL,  )  GO  SET ANSI_PADDING OFFGO  Insert into [tb_demo]  select 1024, getdate(),REPLICATE('A',100);  WAITFOR DELAY '00:00:04';  Insert into [tb_demo]  select 1024, getdate(),REPLICATE('B',50);  go 

    插入存储过程

    /***************创建未加密的存储过程*******************/  Create Procedure CPP_test_Original  AS select * from [tb_demo]  go  /***************创建加密的存储过程*******************/  Create Procedure CPP_test_Encryption   with encryption  AS ----可以换成任意的逻辑  execute CPP_test_Original  go 

    未加密的存储过程:

     

    加密的存储过程:

     

    此时,至少,存储过程的内容不会被轻易看到(虽然解密也是有可能的)。应用这个,我们可以对某些关键的存储过程进行加密。但此时,存储过程仍然能被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_modules 或 sys.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 AUTHORITYLocalService、NT AUTHORITYNetworkService 或 NT AUTHORITYLocalSystem。执行上下文的用户 ID 存储在元数据中,可以在 sys.sql_modules 或 sys.assembly_modules 目录视图的 execute_as_principal_id 列查看。

    仅适用于 DML 语句:SELECT、INSERT、UPDATE 和 DELETE。

    不适用于模块内的动态查询。

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

    CREATE PROCEDURE dbo.[CPP_SEL_CountRowsFromAnyTable]  @SchemaAndTable nvarchar(255)  AS EXEC ('SELECT COUNT(1) FROM ' + @SchemaAndTable)  GO 

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

    GRANT EXEC ON dbo.[CPP_SEL_CountRowsFromAnyTable] to TonyZhang  go 

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

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

    USE master  GO  CREATE LOGIN JackWang WITH PASSWORD = '123b3b4' USE Testdb2  GO  CREATE USER JackWang  GRANT SELECT ON OBJECT::dbo.[tb_Demo] TO JackWang  GO  /*******  注意:此时,JackWang 可以执行dbo.[tb_Demo的Select   *******/ 

    修改存储的执行者

    USE Testdb2  GO  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新增的透明加密(TDE)功能。

    原文链接:http://www.cnblogs.com/downmoon/archive/2011/02/28/1966662.html

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    帝国CMS7.5编辑器上传图片取消宽高的三种方法

    帝国cms如何自动生成缩略图的实现方法

    Windows 12即将到来,将彻底改变人机交互

    帝国CMS 7.5忘记登陆账号密码怎么办?可以phpmyadmin中重置管理员密码

    帝国CMS 7.5 后台编辑器换行,修改回车键br换行为p标签

    Windows 11 版本与 Windows 10比较,新功能一览

    Windows 11激活产品密钥收集及专业版激活方法

    IT头条

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    严重缩水!NVIDIA将推中国特供RTX 5090 DD:只剩24GB显存

    00:17

    无线路由大厂 TP-Link突然大裁员:补偿N+3

    02:39

    Meta 千万美金招募AI高级人才

    00:22

    技术热点

    微软已修复windows 7/windows 8.1媒体中心严重漏洞 用户可下载安

    卸载MySQL数据库,用rpm如何实现

    windows 7中使用网上银行或支付宝支付时总是打不开支付页面

    一致性哈希算法原理设计

    MySQL数字类型中的三种常用种类

    如何解决SQL Server中传入select语句in范围参数

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。