2012-02-14 50 views
1

我有一個程序,允許用戶執行SQL腳本。我有一個用戶登錄到程序,但有一個要求是爲了防止任何執行,即使它是一個管理員用戶。是否有SQL執行關鍵字的列表,例如。 INSERT,ALTER

我的意思是用戶不能修改表等。通常我會建議所有用戶連接設置爲只讀,但程序中有一個元素需要能夠執行INSERT。

我想檢測用戶可能執行的關鍵字eg/INSERT,UPDATE,ALTER,並希望在某處定義了一個列表。

+0

對於SQL注入? – 2012-02-14 11:01:54

+0

Oracle應該如何知道用戶想要執行哪些語句? – 2012-02-14 11:02:34

+0

它不應該阻止用戶編寫DROP TABLE或INSERT或ALTER或EXEC – Jon 2012-02-14 11:05:14

回答

2

我認爲你最好用白名單列出你想允許用戶做的事情,而不是試圖將你不希望他們做的所有事情列入黑名單。

他們只被允許運行一個SELECT?

+1

這個怎麼樣:'SELECT * INTO T1 FROM T;' – onedaywhen 2012-02-14 11:33:12

4

從您的問題中不清楚爲什麼您不只是使用權限:根據需要爲用戶提供SELECT和/或INSERT權限。您也可以將關鍵操作包裝在存儲過程中,並僅在程序中授予EXECUTE,以便更好地滿足您的需求。

解析實際的SQL很困難,因爲你不能只搜索某些單詞,你還必須建立它們的上下文。使用「刪除」爲例:

-- I guess you don't want this 
delete from dbo.SomeTable 
-- but maybe you do want this? 
select * from dbo.SomeTable where Status = 'deleted' 

和惡意(或只是好奇),用戶肯定會得到樂趣測試您的解析代碼的限制,看看他們可以用EXEC,sp_executesql的,OPENQUERY等做

權限(可能與存儲過程一起使用)在這裏是真正的解決方案,因爲您建議的替代方法將是一種編寫和維護的難題,並且幾乎肯定會有漏洞。

+1

這應該是被接受的答案。比讓用戶在運行中編寫SQL代碼更安全,更安全。 – 2015-06-17 21:23:01

相關問題