當今大多數 Web 應用程序都需要至少采用某種基本的安全策略。例如,提供用口令保護的內容的網站、僅具有治理員後端的網站、網志和個人雜志、電子商務網站、企業內聯網,等等。
構建這些類型的 Web 應用程序最常用的設計方法是將安全策略整合到 Web 應用程序的業務邏輯中,即由應用程序決定某個用戶是否有權訪問數據庫中的某個數據。在這種情形下,數據庫的角色僅為存儲數據和依請求提供數據。換句話說,假如 Web 應用程序命令數據庫提供特定信息,則數據庫會直接執行該命令而不檢查用戶的權限。
在該文中,您將學習如何利用 Oracle 內置的安全特性在數據庫級執行應用程序安全規則,以提高應用程序的整體安全性。作為附帶的好處,直接在數據庫中實現數據訪問安全不但有助於提高應用程的安全性,而且有助於降低復雜性。
對數據庫端安全性的需求
從 Web 應用程序控制數據訪問會怎麼樣?大多數情況下沒有問題;這是個不錯的解決方案,尤其是在涉及的數據為非任務要害或絕密的時候。許多書和在線資源中都用到了該方法。實際上,有本很受歡迎的 PHP/MySQL 書明確反對每個應用程序創建一個以上的數據庫用戶帳戶,這是因為“額外的用戶或復雜的權限會因某個操作在繼續前要檢查更多的信息而降低 MySQL 的執行速度”。確實如此;但是,在放棄將安全性整合到數據庫邏輯中的想法前可能要考慮幾件事情。我們來看以下示例。
假設創建一個內容治理系統 (CMS)。其中使用數據庫來存儲網站上發布的內容。大部分數據是公開的,答應匿名 Web 用戶讀取;但只答應編輯更改數據。使用單一數據庫帳戶訪問和修改數據庫中的記錄,並通過用口令保護僅治理員可以訪問的頁面的訪問權限用 PHP 代碼控制安全性。
假如 Web 應用程序的公共端遭受了一個諸如公共搜索表單(即編碼不夠嚴密的表單)上的 SQL 注入的攻擊,則該入侵者可能能夠對該公共帳戶可以訪問的數據庫對象執行任意 SQL 語句。當然,就這裡的情形而言,執行 SELECT 語句不會造成什麼大問題,這是因為數據本來就是公共的。但由於公共權限和治理權限使用同一數據庫帳戶,因此入侵者還能執行 UPDATE 和 DELETE 語句,甚至是從數據庫中刪除表。
怎麼才能防止該情況的發生呢?最簡單的方法就是徹底限制公共數據庫帳戶修改數據的權限。我們來看看 Oracle 是如何解決這個問題的。
Oracle 安全性基本概述
Oracle 數據庫為 Web 開發人員提供了控制數據訪問的許多方法,從治理對特定數據庫對象(如表、視圖和過程)的訪問到控制個別行或列的數據的訪問。很顯然,對 Oracle 每個安全特性或可用選項的討論超出了本文的范圍。在這裡,我們將不涉及過多細節,而僅介紹 Oracle 數據訪問安全性的最基本方面:
驗證和用戶帳戶
權限
角色
驗證和用戶帳戶。 與其他數據庫一樣,請求訪問 Oracle 的每個用戶(數據庫帳戶)必須通過驗證。驗證工作可以由數據庫、操作系統或網絡服務來做。除基本的驗證(口令驗證)外,Oracle 還支持強驗證機制,如Kerberos、CyberSafe、RADIUS,等等。
角色。 Oracle 角色是一個權限的有名集。盡管可以直接授予用戶帳戶權限,但使用角色可以極大簡化用戶治理,尤其是需要治理大量用戶時。創建易治理的小角色,然後根據用戶的安全級別授予用戶一個或多個角色,這樣做的效率非常高。更不用說修改權限變得如何簡單了