我有一個程序,允許用戶執行SQL腳本。我有一個用戶登錄到程序,但有一個要求是爲了防止任何執行,即使它是一個管理員用戶。是否有SQL執行關鍵字的列表,例如。 INSERT,ALTER
我的意思是用戶不能修改表等。通常我會建議所有用戶連接設置爲只讀,但程序中有一個元素需要能夠執行INSERT。
我想檢測用戶可能執行的關鍵字eg/INSERT,UPDATE,ALTER,並希望在某處定義了一個列表。
我有一個程序,允許用戶執行SQL腳本。我有一個用戶登錄到程序,但有一個要求是爲了防止任何執行,即使它是一個管理員用戶。是否有SQL執行關鍵字的列表,例如。 INSERT,ALTER
我的意思是用戶不能修改表等。通常我會建議所有用戶連接設置爲只讀,但程序中有一個元素需要能夠執行INSERT。
我想檢測用戶可能執行的關鍵字eg/INSERT,UPDATE,ALTER,並希望在某處定義了一個列表。
我認爲你最好用白名單列出你想允許用戶做的事情,而不是試圖將你不希望他們做的所有事情列入黑名單。
他們只被允許運行一個SELECT?
這個怎麼樣:'SELECT * INTO T1 FROM T;' – onedaywhen 2012-02-14 11:33:12
從您的問題中不清楚爲什麼您不只是使用權限:根據需要爲用戶提供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等做
權限(可能與存儲過程一起使用)在這裏是真正的解決方案,因爲您建議的替代方法將是一種編寫和維護的難題,並且幾乎肯定會有漏洞。
這應該是被接受的答案。比讓用戶在運行中編寫SQL代碼更安全,更安全。 – 2015-06-17 21:23:01
對於SQL注入? – 2012-02-14 11:01:54
Oracle應該如何知道用戶想要執行哪些語句? – 2012-02-14 11:02:34
它不應該阻止用戶編寫DROP TABLE或INSERT或ALTER或EXEC – Jon 2012-02-14 11:05:14