日韩天天综合网_野战两个奶头被亲到高潮_亚洲日韩欧美精品综合_av女人天堂污污污_视频一区**字幕无弹窗_国产亚洲欧美小视频_国内性爱精品在线免费视频_国产一级电影在线播放_日韩欧美内地福利_亚洲一二三不卡片区

怎樣從數(shù)據(jù)行入手保護(hù)SQL Server數(shù)據(jù)安全_Mssql數(shù)據(jù)庫(kù)教程

編輯Tag賺U幣
教程Tag:暫無(wú)Tag,歡迎添加,賺取U幣!

推薦:解讀編寫(xiě)和優(yōu)化SQL Server的存儲(chǔ)過(guò)程
在數(shù)據(jù)庫(kù)的開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)遇到復(fù)雜的業(yè)務(wù)邏輯和對(duì)數(shù)據(jù)庫(kù)的操作,這個(gè)時(shí)候就會(huì)用SP來(lái)封裝數(shù)據(jù)庫(kù)操作。如果項(xiàng)目的SP較多,書(shū)寫(xiě)又沒(méi)有一定的規(guī)范,將會(huì)影響以后的系統(tǒng)維護(hù)困難和大SP邏輯的難以理解,另外如果數(shù)據(jù)庫(kù)的數(shù)據(jù)量大或者項(xiàng)目對(duì)SP的性能要求很,就

在當(dāng)今企業(yè)環(huán)境中,保證數(shù)據(jù)安全不是可有可無(wú)的工作。頻繁曝光的入侵和欺騙事件、薩班斯◆奧克斯利法案、HIPAA法案規(guī)定和愛(ài)國(guó)者法案等都要求我們能夠做到,將正確數(shù)據(jù)提供給正確的用戶(hù),防止其它無(wú)權(quán)限的人訪(fǎng)問(wèn)。一般來(lái)說(shuō),“行級(jí)安全(row-level security)”的要求是:對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)以行為單位,設(shè)定只有特定用戶(hù)才可以訪(fǎng)問(wèn)�?上У氖�,SQL Server數(shù)據(jù)庫(kù)并不提供內(nèi)置的行級(jí)別安全機(jī)制。

在本篇文章中,通過(guò)一個(gè)示例代碼(代碼清單1),來(lái)告訴大家一個(gè)在SQL Server中實(shí)現(xiàn)行級(jí)別安全的方法,以行為單位限定用戶(hù)的訪(fǎng)問(wèn)權(quán)限,同時(shí)無(wú)需修改業(yè)務(wù)表的內(nèi)容,不影響應(yīng)用程序或表現(xiàn)層開(kāi)發(fā)者,而且與用戶(hù)訪(fǎng)問(wèn)數(shù)據(jù)的方式無(wú)關(guān)。該示例應(yīng)用的模擬需求為:如何增加安全性到現(xiàn)有訂單數(shù)據(jù)庫(kù)中,限制經(jīng)理只能訪(fǎng)問(wèn)他們管理的部門(mén)或其子部門(mén)的數(shù)據(jù),而不管用戶(hù)如何獲得該表,以及針對(duì)這個(gè)數(shù)據(jù)庫(kù)開(kāi)發(fā)什么樣的報(bào)表和查詢(xún)。

代碼清單1:提供了創(chuàng)建和加載示例表的腳本

 

--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
INSERTINTO [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

 

 

行級(jí)別安全代碼范例

首先我們作出如下假設(shè):

◆使用SQL Server數(shù)據(jù)庫(kù)(微軟SQL Server 2000、2005或2008)

◆所有表中都有一個(gè)共同的字段,使用它來(lái)決定誰(shuí)可以看什么數(shù)據(jù)(本例中就是department字段)

◆通過(guò)不同的用戶(hù)id來(lái)加強(qiáng)應(yīng)用程序調(diào)用數(shù)據(jù)庫(kù)的安全性,而不是通過(guò)一個(gè)單一的admin用戶(hù)id。

舉例來(lái)說(shuō),圖1所示數(shù)據(jù)結(jié)構(gòu)包含:Orders表,包含一個(gè)客戶(hù)名稱(chēng)、訂單收入和銷(xiāo)售部門(mén);一個(gè)部門(mén)查閱表(Departments),包含父部門(mén)字段;一個(gè)用戶(hù)訪(fǎng)問(wèn)表(UserAccess),在用戶(hù)和他有權(quán)限查看的部門(mén)之間建立聯(lián)系。用戶(hù)訪(fǎng)問(wèn)表的每一行數(shù)據(jù)代表一個(gè)正確的用戶(hù)/部門(mén)組合。如果一個(gè)用戶(hù)有權(quán)限訪(fǎng)問(wèn)的部門(mén)下設(shè)許多子部門(mén),那么這個(gè)父部門(mén)和每一個(gè)子部門(mén)在表中各占據(jù)一行數(shù)據(jù)。

圖1 該數(shù)據(jù)庫(kù)模型圖顯示了本例中所用到的表

讓訂單數(shù)據(jù)保持安全的關(guān)鍵是,通過(guò)SQL Server的表值型函數(shù)來(lái)保護(hù)它,該函數(shù)要求使用當(dāng)前用戶(hù)的id作為參數(shù)。表值型函數(shù)與其它函數(shù)一樣可以接受參數(shù),但是返回結(jié)果為一個(gè)表,而并非一個(gè)變量。在這個(gè)函數(shù)內(nèi),通過(guò)其安全屬性聯(lián)合要保護(hù)的表與用戶(hù)訪(fǎng)問(wèn)表,將表的結(jié)果限定在與指定用戶(hù)id相關(guān)的范圍之內(nèi)。

示例1定義了一個(gè)表值型函數(shù),根據(jù)UserAccess表中的限制用戶(hù)可以查看的內(nèi)容,返回訂單數(shù)量和訂單的總收入。

示例1:創(chuàng)建保護(hù)訂單數(shù)據(jù)的表值型函數(shù)的SQL語(yǔ)句

CREATE FUNCTION [dbo].[GetOrderSummary] 
(
@User_Id VARCHAR(20)
)
RETURNS TABLE
AS
RETURN
(
SELECTcount(*) as OrderCount,
sum(OrderTotal) as Receipts
FROMdbo.Orderso
Joindbo.UserAccess ua
Ono.Department = ua.Department
WHERE ua.UserID = @User_Id
)

而圖2顯示了該函數(shù)的執(zhí)行示例,以及相關(guān)表的數(shù)據(jù)內(nèi)容,如表1、表2和表3.

 

圖2 表值型函數(shù)執(zhí)行示例

 

表1 UserAccess示例表內(nèi)容

 

表2 Orders示例表內(nèi)容

  

表3 Department表內(nèi)容

顯示受保護(hù)表內(nèi)容

通過(guò)表值型函數(shù)保護(hù)了某個(gè)表之后,你然后可以通過(guò)類(lèi)似示例2的視圖將其展示給用戶(hù)。該視圖調(diào)用了上面定義的表值型函數(shù),并使用參數(shù)“user”,在SQL Server中這是一個(gè)內(nèi)置函數(shù),返回當(dāng)前活躍用戶(hù)的ID。

示例2:創(chuàng)建一個(gè)視圖讓安全用戶(hù)訪(fǎng)問(wèn)受保護(hù)表的SQL

CREATE VIEW[dbo].[OrderSummary]
AS
SELECTOrderCount,
Receipts
FROMdbo.GetOrderSummary(USER)

這個(gè)視圖是用戶(hù)被授予訪(fǎng)問(wèn)權(quán)限的唯一對(duì)象,即使用戶(hù)不具有權(quán)限使用前面的表值型函數(shù)或訪(fǎng)問(wèn)受保護(hù)表,他也可以獲得被許可查看的數(shù)據(jù)。

實(shí)際應(yīng)用思考

在應(yīng)用程序開(kāi)發(fā)實(shí)際情況中,這種方式往往需要一個(gè)以上的屬性來(lái)定義用戶(hù)行級(jí)別權(quán)限,而且往往需要對(duì)多個(gè)表應(yīng)用安全機(jī)制。

另外,不同的數(shù)據(jù)可能具有不同的安全考慮。舉例來(lái)說(shuō),一個(gè)用戶(hù)可能有權(quán)限訪(fǎng)問(wèn)某個(gè)區(qū)域的銷(xiāo)售結(jié)果,但不能訪(fǎng)問(wèn)匯總薪酬數(shù)據(jù)。在復(fù)雜的實(shí)際環(huán)境中成功運(yùn)用這個(gè)戰(zhàn)略的關(guān)鍵是,收集并確認(rèn)來(lái)自業(yè)務(wù)的需求,然后根據(jù)這些需求來(lái)選擇合適的屬性來(lái)實(shí)施行級(jí)別安全。

使用活動(dòng)目錄的企業(yè),可以按照活動(dòng)目錄組來(lái)使用這種方式獲得安全性,而并一定僅限于使用用戶(hù)ID,實(shí)現(xiàn)方法非常簡(jiǎn)單,只需要在UserAccess表中使用活動(dòng)目錄組替代用戶(hù)ID即可。

相關(guān)閱讀

薩班斯-奧克斯利法案(Sarbanes-Oxley Act)是美國(guó)立法機(jī)構(gòu)根據(jù)安然有限公司、世界通訊公司等財(cái)務(wù)欺詐事件破產(chǎn)暴露出來(lái)的公司和證券監(jiān)管問(wèn)題所立的監(jiān)管法規(guī),簡(jiǎn)稱(chēng)《SOX法案》或《索克思法案》。

法案全稱(chēng)《2002年公眾公司會(huì)計(jì)改革和投資者保護(hù)法案》由參議院銀行委員會(huì)主席薩班斯(Paul Sarbanes)和眾議院金融服務(wù)委員會(huì)(Committee on Financial Services)主席奧克斯利(Mike Oxley)聯(lián)合提出,又被稱(chēng)作《2002年薩班斯-奧克斯利法案》。該法案對(duì)美國(guó)《1933年證券法》、《1934年證券交易法》做出大幅修訂,在公司治理、會(huì)計(jì)職業(yè)監(jiān)管、證券市場(chǎng)監(jiān)管等方面作出了許多新的規(guī)定。

分享:談SQL Server應(yīng)用程序的高級(jí)Sql注入
結(jié)構(gòu)化查詢(xún)語(yǔ)言(SQL)是一種用來(lái)和數(shù)據(jù)庫(kù)交互的文本語(yǔ)言SQL語(yǔ)言多種多樣,大多的方言版本都共同寬松地遵循SQL-92標(biāo)準(zhǔn)(最新的ANSI標(biāo)準(zhǔn)[譯者注:目前最新的是SQL-99])。SQL運(yùn)行的典型的操作是查詢(xún),它是可以讓數(shù)據(jù)庫(kù)返回查詢(xún)結(jié)果記錄集的語(yǔ)句集合。SQL語(yǔ)句可以

來(lái)源:模板無(wú)憂(yōu)//所屬分類(lèi):Mssql數(shù)據(jù)庫(kù)教程/更新時(shí)間:2009-07-11
相關(guān)Mssql數(shù)據(jù)庫(kù)教程