章 27. 資料庫安全

今時今日,資料庫系統已經成為各個動態網站上 web 套用程式的重要組成部分。由於非常敏感和機密的資料有可能儲存在資料庫中,所以對資料庫實施保護就顯得尤為重要了。

要從資料庫中提取或是存入資料,就必須經由連線資料庫、傳送一條合法查詢、取得結果、關閉連線等步驟。目前,能完成這一系列動作的最常用的查詢語系是結構化查詢語系 Structured Query Language (SQL)。可以看看攻擊者是如何篡改 SQL 查詢語句的

PHP 本身並不能保護資料庫的安全。下面的章節只是講述怎樣用 PHP 腳本對資料庫進行基本的訪問和動作。

記住一條簡單的原則:深入防禦。保護資料庫的措施越多,攻擊者就越難獲得和使用資料庫內的訊息。正確地設計和套用資料庫可以減少被攻擊的擔憂。

設計資料庫

第一步一般都是建立資料庫,除非是使用第三方的資料庫服務。當建立一個資料庫的時候,會指定一個所有者來執行和新增語句。通常,只有所有者(或超級會員)才有權對資料庫中的對象進行任意動作。若果想讓其他會員使用,就必須賦予他們權限。

套用程式永遠不要使用資料庫所有者或超級會員帳號來連線資料庫,因為這些帳號可以執行任意的動作,比如說修改資料庫結構(例如移除一個表)或是清理整個資料庫的內容。

應該為程式的每個方面建立不同的資料庫帳號,並賦予對資料庫對象的極有限的權限。僅配置給能完成其功能所需的權限,避免同一個會員可以完成另一個會員的事情。這樣即使攻擊者利用程式漏洞取得了資料庫的訪問權限,也最多只能做到和該程式一樣的影響範圍。

鼓勵會員不要把所有的事務邏輯都用 web 套用程式(即會員的腳本)來實現。最好用檢視(view)、觸發器(trigger)或是規則(rule)在資料庫層面完成。當系統升級的時候,需要為資料庫開闢新的介面,這時就必須重做所有的資料庫用戶端。除此之外,觸發器還可以透明和自動地處理欄位,並在除錯程式和追蹤事實時提供有用的訊息。