MS Sql Server中存儲過程與觸發器的安全隱患
存儲過程與觸發器是Sql Server進行數據庫開發與管理經常使用的兩個對象,但是如果對存儲過程與觸發器的權限設置不當,則會給數據庫帶來巨大的安全隱患,抑或是MS就是這么設計的,是本人杞人憂天。本文測試環境:sql server2005。鑒於本人水平有限,歡迎大家進行討論,如果不對之處,請大家手下留情,輕些拍磚。下面分別進行說明。
首先,建立測試環境
建立測試數據庫 create database test
在測試數據庫中建立兩張表
create table t1(id int ,name varchar(10))
create table t2(id int ,name varchar(10))
向t2表中插入一行數據
insert into t2
select 1,'trieagle'
建立sql身份驗證的登陸賬號 trieagle ,同時test數據庫中建立用trieagle
一、存儲過程
情景說明:如果某用戶擁有創建和執行存儲過程的權限,則該用戶可以建立一個存儲過程,在該存儲過程操作其他表中的數據。那么即使該用戶對其他表沒有操作權限,則調用該存儲過程,可以對其他表中的數據進行操作。
1、為trieagle用戶授予創建存儲過程的權限以及執行存儲過程的權限
grant create proc to trieagle
注意:trieagle用戶要創建存儲過程的話,可能還需要修改schema的權限
grant alter on schema :: dbo to trieagle
2、trieagle建立存儲過程
Create proc p1
as
select * from t2
3、向trieagle用戶賦予執行p1存儲過程的權限
grant exec on p1 to trieagle
4、trieagle執行p1存儲過程
Exec P1
結果
Id name
1 trieagle
成功的查看到t2表中的數據。
安全隱患在於:如果用戶能夠執行、修改存儲過程的話,那么實際上你的數據庫中的數據是出於一種既不安全的狀態。
解決方法:如果該允許某個用戶創建存儲過程的話,讓該用戶在其自己的schema上來創建,這樣可以避免上述問題。即:
管理員:grant create schema to trieagle
用戶:create schema trieagle
Go
Create proc trieagle.p1
as
select * from t2
go
Exec trieagle.P1
結果:
消息229,級別14,狀態5,過程p1,第3 行
拒絕了對對象't2' (數據庫'test',架構'dbo')的SELECT 權限。
同樣的情況在oracle上也存在,oracle的解釋是:執行者執行存儲過程時,會使用存儲過程設計者所具有的權限,但是可以使用authid current_user指定用戶運行存儲過程時使用的權限。Sql server中有類似的語句是 在execute as ,但使用方法還未學習,例如:
create proc p1
with execute as 'trieagle'
as
select * from t2
二、觸發器
情景說明:如果某用戶擁有修改表的權限以及向表中有(insert、update、delete)權限之一的話,則該用戶即可創建觸發器。那么該用戶在觸發器中可以查看其他表的數據,甚至插入、修改、刪除其他表的數據,即使該用戶對其他表沒有任何的操作權限。
一、建立測試環境
為trieagle用戶授予向t1插入數據的權限,以及修改t1的權限
grant alter on t1 to trieagle
grant insert on t1 to trieagle
注意,在此並沒有為trieagle用戶賦予t2表的任何權限
二、trieagle用戶創建觸發器
create trigger t_query_t2
on t1
for insert
as
select * from t2
三、trieagle向t1表中插入數據
insert into t1 select 2,'wang'
觀察結果,你會發現,會成功顯示t2表中的數據。結果:
Id name
trieagle
安全隱患在於:如果用戶能夠創建觸發器,並且在該表上有insert、update、delete權限之一的話,則實際上你的數據庫中的數據是出於一種不安全的狀態。
