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
GOCREATE TABLE [dbo].[tb_demo](
 
[id] [int] NOT NULL, [submitdate] [datetime] NULL,
 
[commment] [nvarchar](200) NULL,)GOSET ANSI_PADDING
 
OFFGOInsert 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

it知识库SQL Server 2008中的代码安全(一):存储过程加密与安全上下文,转载需保留来源!

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。