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