操作系統集成安全性()
() 接下來需要創建一個用戶他只具有SELECT該視圖的特權而沒有其他特權該用戶將自動地被指定給PUBLIC角色
CREATE LOGIN LibraryGuest
WITH PASSWORD = comein;
USE library;
CREATE USER LibraryGuest FOR LOGIN LibraryGuest;
GO;
另外也可以使用已經存在的登錄名GUEST
() 授予新用戶訪問服務器和對vwLastYearBooks視圖運行SELECT語句的特權
GRANT SELECT ON libraryvwLastYearBooks TO LibraryGuest;
REVOKE SELECT INSERT DELETE ON books FROM LibraryGuest;
GO;
() 斷開RDBMS的連接並使用新的憑據用戶ID和密碼重新連接數據庫
() 運行下面的查詢
SELECT * FROM vwLastYearBooks
() 嘗試對BOOKS表運行SELECT查詢
示例說明
新創建的用戶LibraryGuest被授予了對視圖vwLastYearBooks的SELECT特權並撤消了該用戶對BOOKS表選取數據的特權因此即使視圖所顯示的數據來自於BOOKS表但BOOKS表本身對於用戶LibraryGuest是不可訪問的
使用約束提供安全性
約束常常用於維護完整性包括參照完整性數據完整性(也稱為實體完整性)或者域完整性
域完整性約束例如CHECK約束用於檢驗數據是否具有正確的格式和內容例如在LIBRARY數據庫中下面代碼中定義的CHK_ISBN約束用於檢驗輸入到數據庫中的ISBN號是否具有指定的長度
ALTER TABLE books
ADD CONSTRAINT chk_ISBN
CHECK (LEN(bk_isbn) = OR LEN(bk_isbn) = )
這樣無論是合法還是非法的企圖只要輸入了長度不等於或的無效數據就會產生一個錯誤數據被保護以避免出現不一致在將數據提交給數據庫之前先對其進行檢驗這是一種非常高效的安全措施
DEFAULT值是強制執行域完整性的另外一種機制當聲明了DEFAULT值後如果在查詢中省略了數據則DEFAULT約束可以確保使用一個默認值而不是使用空白或NULL值
DEFAULT約束是破壞了安全性還是代表了一種安全性的強制機制這仍然需要討論一方面它避免了數據的不一致性這是好的方面但是另外一方面它通過避免疏忽或遺漏造成的錯誤降低了對數據錄入的精確要求並且方便了惡意入侵者借機插入數據
實體完整性本質上指的是一行數據它是通過索引和諸如PRIMARY KEY約束或UNIQUE約束等來維護的它可以高效地防止用戶輸入重復的值例如在社會安全號碼(SocialSecurity numberSSN)列上設置約束可以避免惡意用戶使用相同的SSN和不同的名字來重復地獲得好處
對於聲明了關系的表參照完整性維護著表與表之間關系的健康參照完整性是一個都不能少方針的RDBMS版本它強制執行這樣的約束如果父表中沒有相對應的父記錄則子表中也不允許存在子記錄只要在子表中還具有一條對應的子記錄就不允許刪除父表中與之對應的父記錄
約束本身只能為數據庫的安全性提供非常有限的保護應該作為RDBMS整體安全性所提供的更為健壯的安全機制的補充
存儲過程和觸發器(在第章中已經介紹過)也是實現安全性的措施之一存儲過程有助於限制對數據庫對象的訪問並實現輸入檢驗觸發器則是存儲過程的一個變種當在表上執行INSERTUPDATE或DELETE操作時它將自動執行用於檢驗數據或者累積審計信息
SQL注入
對於使用了動態構建SQL語句(關於動態SQL的更多信息請參考第章)的數據庫應用程序SQL注入是利用該弱點進行攻擊的一種技術SQL注入技術背後的思想是修改底層的SQL語句要麼在WHERE子句中應用更寬泛的選取條件要麼在SQL語句的末尾追加額外的SQL命令例如如果在客戶端應用程序中使用下面的SQL語句檢查一個特定的user_ID(這樣的語句顯然是蹩腳的)期望的結果是如果沒有返回任何行則表示身份驗證失敗
SELECT * FROM users WHERE user_id = + <user_ID> +
現在假設惡意攻擊者在user_ID域中輸入了somebody OR a=a那麼該語句將翻譯為下面的語句
SELECT FROM Users WHERE user_ID = somebody OR a = a
由於沒有somebody這個user_ID因此WHERE子句的第一部分將會失敗但是對第二個部分a = a求值的結果為TRUE因此將返回一行數據從而可能會認為該用戶已經通過了身份驗證
在前面的例子中攻擊者還可以采用輸入<user_ID> ;<另外一條SQL語句>這樣的形式迫使服務器執行一個意料之外的語句例如
SELECT FROM Users WHERE user_ID = somebody ; DELETE FROM books;
如果執行了上面的語句將刪除BOOKS表中的所有記錄(這要求對數據庫的結構具有一定的知識或者聰明地猜測出攻擊方的意圖)
返回目錄SQL實戰新手入門
編輯推薦
Oracle索引技術
高性能MySQL
數據倉庫與數據挖掘培訓視頻教程
From:http://tw.wingwit.com/Article/program/SQL/201311/16439.html