網路上關於 SQL Injection 的文章眾多,但真正講透原理與根治之道者寡。本文從攻擊本質切入,揭示為何「拼湊 SQL 字串」是萬惡之源,並給出徹底解決方案。
SQL Injection 就是向伺服器提交精心構造的資料,拼湊出攻擊者想要的 SQL 陳述式,以改變資料庫操作執行計畫。
這句話包含三層關鍵含義:
-- 應用程式原始碼 (ASP/PHP/Java 等)
UPDATE tableName
SET columnName1 = "$Client_Submit_Data"
WHERE PK_ID = 1234
若使用者輸入:誰能告訴我 "SQL injection" 是什麼?
拼湊後 SQL 變為:
UPDATE tableName
SET columnName1 = "誰能告訴我" SQL injection "是什麼?"
WHERE PK_ID = 1234
實際執行:UPDATE tableName SET columnName1 = "誰能告訴我" — **WHERE 子句被截斷,全表資料被竄改!**
此例中使用者無惡意,但結果等同 SQL Injection。
-- 參數化查詢 (ADO.NET 範例)
string sql = "UPDATE tableName SET columnName1 = @title WHERE PK_ID = @id";
using (SqlCommand cmd = new SqlCommand(sql, conn)) {
cmd.Parameters.AddWithValue("@title", userInput); // 傳入值,非字串拼湊
cmd.Parameters.AddWithValue("@id", 1234);
cmd.ExecuteNonQuery();
}
EXEC sp_UpdateTitle @id, @title| 層級 | 措施 | 說明 |
|---|---|---|
| 1. 開發規範 | 禁止字串拼湊 SQL,Code Review 強制檢查 | 源頭阻斷 |
| 2. ORM 框架 | Entity Framework、Dapper、Hibernate 等 | 內建參數化,降低手寫 SQL 風險 |
| 3. 資料庫權限 | 應用帳號僅擁有必要權限,嚴禁 sysadmin/db_owner | 縮小受損範圍 |
| 4. WAF/IDS | Web 應用防火牆偵測異常 SQL 模式 | 防禦深度,非首要依賴 |
| 5. 審計與監控 | 啟用 SQL Server Audit、Extended Events 記錄異常執行 | 事後追蹤與合規 |
MySQL 4.1+ 提供 PREPARE/EXECUTE 機制,本質同屬參數化查詢,系統預置的預存程序形式。
**SQL Injection 的根源不在使用者輸入,而在開發者選擇了「字串拼湊」這條捷徑。** 只要堅持「執行計畫與資料分離」的參數化原則,SQL Injection 即可從架構層面徹底消除。這不僅是安全需求,更是專業軟體工程的基本素養。