Navicat 部落格

在資料庫層防止 SQL 隱碼攻擊 2021 年 4 月 14 日,由 Robert Gravelle 撰寫

許多組織會致力在其應用程式中實作輸入驗證來保護其資料。事實上,大多數網路攻擊直接針對資料庫服務器本身,而應用程式安全性根本沒有發揮作用!身為一個資料庫管理員(DBA)或資料庫開發人員,你有強大的能力來降低網路攻擊的風險和/或由此造成的損害,包括最常見的網路攻擊形式:SQL 隱碼攻擊。在今天的文章中,我們將探索一些可以大大減少遭受 SQL 隱碼攻擊的做法。

將所有資料庫邏輯放在預存程序中

惡意實體越容易將未經過濾的 SQL 傳遞給資料庫伺服器,資料就更容易遺失或被盜。透過將所有查詢和資料調處陳述式(DML)放在預存程序中,可以使黑客更難發出 DML 陳述式。

下列程式碼範例使用 CallableStatement(Java 對預存程序介面的實作)執行相同的資料庫查詢:

String custname = request.getParameter("customerName");
try {
  CallableStatement cs = connection.prepareCall("{call sp_getCustomerAccount(?)}");
  cs.setString(1, custname);
  ResultSet results = cs.executeQuery();
  // ...result set handling
} catch (SQLException se) {
  // ...logging and error handling
}

將輸入驗證列入白名單

使用者提供的數值不是用作繫結資料庫實體,例如資料表、欄名稱,甚至排序順序指標(ASC 或 DESC)。這些數值應來自你自己的 SQL 程式碼,而不應來自使用者參數。為了針對特定的資料表名稱和欄名稱,參數值應對應至合法(預期)的資料表名稱和/或欄名稱,以防止未經驗證的使用者輸入最終出現在查詢中。

以下是資料表名稱驗證的範例:

String tableName;
switch(PARAM):
  case "Value1": tableName = "clientTable";
                 break;
  case "Value2": tableName = "employeeTable";
                 break;
  ...
  default      : throw new InputValidationException("unexpected value provided"
                                                  + " for table name");

對於簡單如排序順序,一種解決方案是接受使用者提供的輸入作為布林值(boolean),然後將其用於選取要附加到查詢的安全值。實際上,這是動態查詢建構中的一種常見做法。

public String myMethod(boolean sortOrder) {
  String SQLquery = "some SQL ... order by Salary " + (sortOrder ? "ASC" : "DESC");
  ...

逸出或清除所有使用者提供的輸入

只有當以上的方法都不可行時,才應該使用使用者輸入逸出。與其他防禦相比,此防禦被認為是比較弱,原因是無法保證它能防止在每一種可能的情況下所有的 SQL 隱碼攻擊。

將使用者輸入的逸出與特定的資料庫類型比對是非常重要,因為每個 DBMS 都支援某些類型查詢專用的一個或多個字元逸出配置。為特定資料庫使用正確的逸出配置來逸出所有使用者提供的輸入,那麼 DBMS 就不會將使用者輸入與開發人員撰寫的 SQL 程式碼混淆,從而避免了任何可能的 SQL 隱碼攻擊漏洞。

OWASP Enterprise Security API (ESAPI) 是一個免費、開放原始碼的 Web 應用程式安全控制函式庫,它使程式員可以更輕鬆地增強其應用程式免受網路攻擊。ESAPI 函式庫被設計來使程式員能更容易在現有應用程式中引入安全因素。

使用 ESAPI 資料庫轉碼器是非常簡單。以下是一個 Oracle 的範例:

ESAPI.encoder().encodeForSQL( new OracleCodec(), queryparam );

總結

身為一個資料庫管理員(DBA)或資料庫開發人員,你有強大的能力來降低網路攻擊的風險和/或由此造成的損害,包括最常見的網絡攻擊形式:SQL 隱碼攻擊。透過按照今天概述的大綱操作,可以大大減少遭受 SQL 隱碼攻擊的可能性。


Rob Gravelle 居住於加拿大渥太華,是一名有 20 多年經驗的 IT 專家。過住,Rob 曾為情報相關的組織(如加拿大邊境服務局和各種商業組織)建置系統。如果你想僱用 Rob,可以傳送電子郵件到 rgconsulting(AT)robgravelle(DOT)com。在業餘時間,Rob 是一名出色的吉他演奏家,並發行了幾張 CD

Navicat 文章
頻道記錄
分享
部落格封存檔