从数据行入手保护SQL Server数据安全

作者:思维牧童 来源:IT168 时间:2009-04-13 10:28:00 

在当今企业环境中,保证数据安全不是可有可无的工作。频繁曝光的入侵和欺骗事件、萨班斯•奥克斯利法案、HIPAA法案规定和爱国者法案等都要求我们能够做到,将正确数据提供给正确的用户,防止其它无权限的人访问。一般来说,“行级安全(row-level security)”的要求是:对数据库中的数据以行为单位,设定只有特定用户才可以访问。可惜的是,SQL Server数据库并不提供内置的行级别安全机制。

在本篇文章中,通过一个示例代码(代码清单1),来告诉大家一个在SQL Server中实现行级别安全的方法,以行为单位限定用户的访问权限,同时无需修改业务表的内容,不影响应用程序或表现层开发者,而且与用户访问数据的方式无关。该示例应用的模拟需求为:如何增加安全性到现有订单数据库中,限制经理只能访问他们管理的部门或其子部门的数据,而不管用户如何获得该表,以及针对这个数据库开发什么样的报表和查询。


以下为引用的内容:

--create table script
CREATE TABLE dbo.UserAccess
(
UserID varchar(20) NOT NULL,
Department varchar(50) NOT NULL
)
CREATE TABLE [dbo].[Orders](
[OrderID] [int] NOT NULL,
[CustomerName] [varchar](20) NOT NULL,
[OrderTotal] [money] NOT NULL,
[Department] [varchar](50) NOT NULL
)
CREATE TABLE dbo.Departments
(
Department varchar(50) NOT NULL,
ParentDepartment varchar(50)
)
--end create table script

--script to clear then populate example tables

--clear tables
Delete from departments
Delete from orders
Delete from useraccess

--insert departments table
INSERT  INTO [dbo].[Departments] ([Department],[ParentDepartment]) VALUES ('North America','')
INSERT INTO [dbo].[Departments] ([Department],[ParentDepartment]) VALUES ('East','North America')
INSERT INTO [dbo].[Departments] ([Department],[ParentDepartment]) VALUES ('Southeast','East')
INSERT INTO [dbo].[Departments] ([Department],[ParentDepartment]) VALUES ('Northeast','East')
INSERT INTO [dbo].[Departments] ([Department],[ParentDepartment]) VALUES ('West','North America')
INSERT INTO [dbo].[Departments] ([Department],[ParentDepartment]) VALUES ('Southwest','West')
INSERT INTO [dbo].[Departments] ([Department],[ParentDepartment]) VALUES ('Northwest','West')

--insert orders table
INSERT INTO [dbo].[Orders] ([OrderID],[CustomerName],[OrderTotal],[Department]) VALUES (1,'Harris','11.00','East')
INSERT INTO [dbo].[Orders] ([OrderID],[CustomerName],[OrderTotal],[Department]) VALUES (2,'Corrigan','22.00','Southeast')
INSERT INTO [dbo].[Orders] ([OrderID],[CustomerName],[OrderTotal],[Department]) VALUES (2,'Corrigan','22.00','Southeast')
INSERT INTO [dbo].[Orders] ([OrderID],[CustomerName],[OrderTotal],[Department]) VALUES (3,'Baldwin','33.00','Southeast')
INSERT INTO [dbo].[Orders] ([OrderID],[CustomerName],[OrderTotal],[Department]) VALUES (4,'Pillow','44.00','Northeast')
INSERT INTO [dbo].[Orders] ([OrderID],[CustomerName],[OrderTotal],[Department]) VALUES (5,'Carpenter','55.00','Northeast')
INSERT INTO [dbo].[Orders] ([OrderID],[CustomerName],[OrderTotal],[Department]) VALUES (6,'Meyer','66.00','West')
INSERT INTO [dbo].[Orders] ([OrderID],[CustomerName],[OrderTotal],[Department]) VALUES (7,'Gonzalez','77.00','Southwest')
INSERT INTO [dbo].[Orders] ([OrderID],[CustomerName],[OrderTotal],[Department]) VALUES (8,'Hall','88.00','Northwest')
INSERT INTO [dbo].[Orders] ([OrderID],[CustomerName],[OrderTotal],[Department]) VALUES (9,'Patrick','99.00','Southwest')

--insert user access table
INSERT INTO [dbo].[UserAccess] ([UserID],[Department]) VALUES ('BLambert','Southwest')
INSERT INTO [dbo].[UserAccess] ([UserID],[Department]) VALUES ('MDavis','East')
INSERT INTO [dbo].[UserAccess] ([UserID],[Department]) VALUES ('MDavis','Southeast')
INSERT INTO [dbo].[UserAccess] ([UserID],[Department]) VALUES ('MDavis','Northeast')
INSERT INTO [dbo].[UserAccess] ([UserID],[Department]) VALUES ('WSimmons','Northeast')

--end script to clear then populate example tables

代码清单1:提供了创建和加载示例表的脚本

标签:SQL,Server,数据安全
0
投稿

猜你喜欢

  • 如何让用户再次访问我的网站时不需再提交相关信息?

    2010-05-16 15:05:00
  • HTML5 声明兼容IE的写法

    2011-06-06 10:34:00
  • 完美的js验证网址url(正则表达式)

    2008-06-07 09:36:00
  • 如何用Cookie进行登录验证?

    2010-06-12 12:34:00
  • 我的css样式写法总结

    2009-01-18 13:04:00
  • 两个不太常用的 CSS Hack

    2008-06-27 12:49:00
  • RSA加密解密算法 asp源码

    2009-08-28 13:10:00
  • SQL语句之WHERE子句的使用方法

    2007-08-11 12:25:00
  • ASP连接11种数据库语法总结

    2007-09-29 12:07:00
  • ASP提速技巧五则

    2008-03-20 13:20:00
  • 一个输入框提示列表效果

    2008-03-09 18:53:00
  • 浅谈Javascript中的事件流和事件绑定

    2009-07-20 17:13:00
  • CSS实例教程:复合型CSS条状图表(下)

    2010-01-23 12:52:00
  • 常用的数据库访问方式是什么?

    2009-11-01 15:08:00
  • JavaScript 编程引入命名空间

    2007-10-11 19:00:00
  • Oracle数据库系统使用经验六则

    2010-07-26 13:22:00
  • Oracle9i在Win2k环境下的完全卸载

    2010-07-28 13:03:00
  • 去掉运行JavaScript时IE产生的警告栏

    2008-09-11 18:07:00
  • SQL Server数据库于应用程序的关系

    2010-07-26 14:21:00
  • 常用ASP自定义函数集 (S.Sams)

    2010-05-27 12:24:00
  • asp之家 网络编程 m.aspxhome.com