現(xiàn)代數(shù)據(jù)庫管理系統(tǒng)廣泛應(yīng)用于辦公自動化,其安全性越來越重要。雖然各種數(shù)據(jù)庫系統(tǒng)提供了相當(dāng)多的安全機制,比如訪問控制、備份恢復(fù)、日志與審計等,但是黑客對數(shù)據(jù)庫的攻擊入侵事件還是很多,很常見的一種情況:通過緩沖區(qū)溢出等途徑突破數(shù)據(jù)庫自身提供的訪問控制功能,提升用戶權(quán)限,然后入侵數(shù)據(jù)庫。SQL Server 2000數(shù)據(jù)庫觸發(fā)器在數(shù)據(jù)庫系統(tǒng)中得到應(yīng)用,提高了數(shù)據(jù)庫系統(tǒng)的安全性。
觸發(fā)器一種特殊類型的存儲過程,當(dāng)使用Insert、Delete、Update語句對數(shù)據(jù)庫表中的數(shù)據(jù)進行操作時,觸發(fā)器將自動執(zhí)行。觸發(fā)器的工作原理,它是觸發(fā)器與表緊密聯(lián)系在一起,該表也稱為觸發(fā)器表。在對表進行插入、刪除和更新操作時,若該表有相應(yīng)操作類型的觸發(fā)器,則觸發(fā)器會自動觸發(fā)執(zhí)行。程序開發(fā)人員利用其工作原理來設(shè)計了一種新的機制,就是把數(shù)據(jù)庫系統(tǒng)提供的訪問控制功能作為第一層的安全保護,再構(gòu)建一層訪問控制機制作為第二層安全控制機制。我們的主要思想是當(dāng)用戶突破第一層安全保護進入數(shù)據(jù)庫時,再啟用第二層的安全保護機制,第二層的安全保護就是控制用戶對數(shù)據(jù)庫的操作權(quán)限。也就是說,你可以提升權(quán)限進入數(shù)據(jù)庫,但是你要操作數(shù)據(jù)庫還不行,你得突破第二層安全保護取得操作權(quán)限。因此,這種機制也就能夠有效的防止用戶的惡意篡改數(shù)據(jù)。
以實驗室信息管理數(shù)據(jù)庫系統(tǒng)為例,介紹觸發(fā)器技術(shù)的應(yīng)用。
1.僅供信息檢索的數(shù)據(jù)庫表(實驗考試成績查詢)
數(shù)據(jù)庫作為存放數(shù)據(jù)的倉庫,在許多情況下,是為了提供信息檢索服務(wù)的。通常的做法是通過為用戶設(shè)定Select權(quán)限來保證數(shù)據(jù)庫表中的數(shù)據(jù)不被修改,這對沒有相應(yīng)權(quán)限的用戶可以起到保護作用。但是,如果用戶通過攻擊手段提升權(quán)限后就可以進行非法的修改操作。在實際的系統(tǒng)設(shè)計中,通過使用觸發(fā)器,把對數(shù)據(jù)庫表中的記錄的修改操作屏蔽掉。在下面的觸發(fā)器中,只給出了提示信息,省去了觸發(fā)器中定義的具體操作的語句。
CREATE TRIGGER tr_ScoreQuery
ON ScoreQuery
INSTEAD OF INSERT,DELETE,UPDATE
AS
PRINT‘非法用戶,禁止修改操作!’
Begin
Insert into log_table(log_user,db_name,event_name,log_time) values(sys.login_user,sys.database_name,sys_sysevent,sysdate);
--觸發(fā)器定義的其他具體操作
End;
GO
GO
2.插入刪除更新操作頻繁的數(shù)據(jù)庫表
如果要對數(shù)據(jù)庫中插入、刪除或更新記錄,就必須先刪除觸發(fā)器,這給數(shù)據(jù)庫管理員帶來許多不便。因此,對于考試系統(tǒng)中用戶管理子系統(tǒng)這一類型的修改操作比較頻繁的數(shù)據(jù)庫,我們不能像上面那樣,不管什么用戶的修改操作一律都屏蔽掉,而是應(yīng)該根據(jù)用戶權(quán)限有所不同??梢酝ㄟ^自定義用戶權(quán)限表來判斷用戶操作的合法性,對于不合法的予以屏蔽。
自定義用戶權(quán)限表包括四個字段:user_id、Insert_of、Delete_of、Update_of,它們的數(shù)據(jù)類型分別為:smallint、bit、bit、bit。其中bit類型中1表示用戶有權(quán)限,0表示用戶沒有權(quán)限。
CREATE TABLE UserRight
( user_id smallint,
Insert_of bit,
Delete_of bit,
Update_of bit
)
在數(shù)據(jù)庫系統(tǒng)運行過程中,可以使用全局函數(shù)CURRENT_USER()來獲取當(dāng)前的用戶名,賦值給@currentuser,之后再使用全局函數(shù)USER_ID(@currentuser)獲取當(dāng)前用戶的ID。
一個屏蔽非法操作的DELETE觸發(fā)器設(shè)計如下:
CREATE TRIGGERtr_UserManage
ON UserManage
AFTER DELETE
AS
IF ((SELECT Delete_of from UserRight WHERE user_id=USER_ID(CURRENT_USER))
!=1)
ROLLBACK TRANSACTION
——其他的操作
GO
觸發(fā)器在系統(tǒng)開發(fā)上有著很廣泛的用途,本文介紹的只是它在加強數(shù)據(jù)庫安全方面的一個小小應(yīng)用。雖然觸發(fā)器的用途很多,但是過多的使用觸發(fā)器或者觸發(fā)器寫得不好,都將影響整個數(shù)據(jù)庫的性能。因此,使用觸發(fā)器的時候必須權(quán)衡各方面的因素,在適當(dāng)?shù)臅r候使用恰當(dāng)?shù)挠|發(fā)器。
參考文獻:
[1]劉衛(wèi)宏:SQL Server 2000實用教程[M].科學(xué)出版社,2003,9
[2]姚渝春等:數(shù)據(jù)庫觸發(fā)器及應(yīng)用[J].重慶建筑大學(xué)學(xué)報,2003(5):128~131
[3]徐曉陽:觸發(fā)器在SQL Server數(shù)據(jù)庫開發(fā)中的應(yīng)用[J].電腦開發(fā)與應(yīng)用,2005(1):48~49