- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
浅析SQL Server 2008中的代码安全之一:存储过程加密与安全上下文
最近对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_Encryptionwith?encryption ?AS?----可以换成任意的逻辑 ?execute?CPP_test_Original ?go?未加密的存储过程:?加密的存储过程:?此时,至少,存储过程的内容不会被轻易看到(虽然解密也是有可能的)。应用这个,我们可以对某些关键的存储过程进行加密。但此时,存储过程仍然能被execute、alter和drop。二安全上下文除了加密sql文本的内容,我们还可以使用EXECUTE AS?子句设定存储过程的安全上下文,以满足不同的安全级别需求。如果你对这些不感兴趣,请直接路过带下划线的段落。(关于EXECUTE AS?子句的详细用法,请参看MSDN:/zh-cn/library/ms188354.aspx)此处,我们需要了解的是:1、在 SQL Server 中,可以定义以下用户定义模块的执行上下文:函数(内联表值函数除外)、过程、队列和触发器。通过指定执行模块的上下文,可以控制数据库引擎使用哪一个用户帐户来验证对模块引用的对象的权限。这有助于人们更灵活、有力地管理用户定义的模块及其所引用对象所形成的对象链中的权限。必须而且只需授予用户对模块自身的权限,而无需授予用户对被引用对象的显式权限。只有运行模块的用户
文档评论(0)