位置: 编程技术 - 正文

SQLServer 2008中的代码安全(一) 存储过程加密与安全上下文(sql server 2008 怎么使用)

编辑:rootadmin

<一>存储过程加密

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

理由如下:

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

我至今还记得大约八、九年前采用的一个权限控制系统就是通过拼凑一个SQL语句,最终得到了一个形如“ where 1=1 and dataID in (1,2) and ModelID in (2,) And ShopID in () 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: SQL Server 中,可以定义以下用户定义模块的执行上下文:函数(内联表值函数除外)、过程、队列和触发器。

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

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

■CALLER 指定模块内的语句在模块调用方的上下文中执行。执行模块的用户不仅必须对模块本身拥有适当的权限,还要对模块引用的任何数据库对象拥有适当权限。 CALLER 是除队列外的所有模块的默认值,与 SQL Server 行为相同。 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 列查看。 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虽然有执行存储过程的权限,但是没有参数表的select权限,所以执行失败。 第四步:修改存储过程的上下文 创建一个新账号jackwang,赋于表tb_Demo的select权限 修改存储的执行者 注意:这样,我们再调用存储过程[CPP_SEL_CountRowsFromAnyTable]时,会自动以JackWang的身份运行该存储过程。 此时,我们仍以Tonyzhang登录,再执行: 小结: 本文通过简单的两个示例开始SQL server代码的安全之旅, 1、存储过程的加密,(注意:加密存储过程前应该备份原始存储过程,且加密应该在部署到生产环境前完成。) 2、存储过程的安全上下文。可以通过上下文设置更加严格的数据访问级别。(主要是对SELECT、INSERT、UPDATE 和 DELETE语句的访问限制)后续部分将会涉及SQL server 新增的透明加密(TDE)功能。

推荐整理分享SQLServer 2008中的代码安全(一) 存储过程加密与安全上下文(sql server 2008 怎么使用),希望有所帮助,仅作参考,欢迎阅读内容。

SQLServer 2008中的代码安全(一) 存储过程加密与安全上下文(sql server 2008 怎么使用)

文章相关热门搜索词:sql server 2008使用,sql server 2008r2使用,sql server 2008r2使用,sql server 2008,sqlserver2008介绍,sql server 2008使用,sql server 2008r,sql server 2008使用,内容如对您有帮助,希望把文章链接给更多的朋友!

SQL Server 中的代码安全(二) DDL触发器与登录触发器 本文主要涉及DDL触发器和登录触发器的应用实例。MicrosoftSQLServer提供两种主要机制来强制使用业务规则和数据完整性:约束和触发器。触发器为特殊类

SQL Server 中的代码安全(三) 通过PassPhrase加密 前言:在SQLServer和SQLServer之前。如果希望加密敏感数据,如财务信息、工资或身份证号,必须借助外部应用程序或算法。SQLServer引入内建数据

SQLServer 中的代码安全(四) 主密钥 如下图:1、服务器主密钥(ServiceMasterKey),位于层次结构的最顶端,并且在安装SQLServer时自动创建,用于加密系统数据、链接的服务器登录名以及数据

标签: sql server 2008 怎么使用

本文链接地址:https://www.jiuchutong.com/biancheng/319090.html 转载请保留说明!

上一篇:SQL2008中SQL应用之- 死锁(Deadlocking)(sql2008使用教程)

下一篇:SQL Server 2008中的代码安全(二) DDL触发器与登录触发器(sql server 2008使用说明)

  • 销售额是含税价还是不含税价
  • 天猫店铺个人可以开吗
  • 收到以前年度银行手续费发票
  • 建筑业老项目如何界定
  • 其他应付款计入资本公积
  • 保单的增值税发票
  • 城镇土地使用税减免税政策
  • 设定受益计划会计处理案例
  • 外商投资企业采购国产设备退税后续监管办法
  • 企业自建固定资产
  • 接受原材料投资的会计处理
  • 不在境内劳务是否付企业所得税
  • 实收资本变更股东要交税吗
  • 工程预收账款的会计分录
  • 银行卡季度结息
  • 事业基金减少原因一般是什么
  • 增值税的税负率就是用应缴纳的增值税总额
  • 有限合伙人企业人数
  • 替票可以写入费用报销制度吗?
  • etc发票一直不出来
  • 小规模减免附加税会计分录怎么做
  • 货物退回发票冲红会计分录
  • 两个帐套合并为一个
  • 先收钱后开票怎么做分录
  • 支付知识产权服务费账务处理
  • 经营租赁方式租入分录
  • 广告制作包括印花吗
  • 没有签订劳动合同上班期间受伤怎么赔偿
  • 生产企业原材料的订购与运输建模
  • 外贸企业代理出口销售的出口退税手续由谁办理
  • PHP:curl_errno()的用法_cURL函数
  • uniapp多端兼容
  • 分配水电费会计分录需要写税吗?
  • 企业取得的搬迁补贴
  • 前端启动项目命令
  • 虚拟机是什么意思
  • php 单例模式优点及如何实现
  • ts基础
  • 递延所得税负债借贷方向
  • gps定位器怎么开启
  • 帝国cms app
  • 公司注册资金多好还是少好
  • 分公司税务登记流程与操作手册
  • 所得税汇算清缴账务处理
  • 银行会计的基本核算方法包括的内容有
  • 离职员工个税申诉企业怎么处理
  • 税务处理决定书和处罚决定书
  • 企业所得税汇算清缴时间
  • 去年的成本发票做错了需要补税吗
  • 用于不动产的进项税额
  • 增值税劳务费税率是多少
  • 对外服务应收取的款项
  • 支付技术转让费所得税处理
  • 未开票收入账上税率按多少
  • 食堂如何做账
  • sqlserver怎么恢复数据
  • mysql主从复制原理以及架构
  • windowsxpwindows7都是
  • 如何使用U盘装机
  • linux,Centos5,Ubuntu关掉ipv6的方法
  • 电脑出现nobootdevicefound咋办
  • win8免密码登录
  • win7电脑全屏
  • easyui combobox设置值
  • iframe移动端自适应
  • javascript常用类型
  • Node.js中的全局对象有
  • 判断一个点在三角形内部
  • JavaScript中的方法名不区分大小写
  • python3.9快捷键
  • python二分法查找
  • 陕西省地方税务局公告2017年第2号
  • 医保12333查询系统
  • 进入杭州车辆怎么申请
  • 江苏税务查询授权验证码
  • ukey证书初始密码
  • 小微企业印花税的税率是多少
  • 四川省地方税务局2017年1号公告
  • 江苏联通客服电话人工服务号码
  • 个人所得税工资达到多少才交税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设