| 語言/框架 | 錯誤寫法(拼接) | 正確寫法(參數化) |
| C# / ADO.NET | cmd.CommandText = "SELECT * FROM Users WHERE Name = '" + name + "'"; | cmd.CommandText = "SELECT * FROM Users WHERE Name = @Name"; cmd.Parameters.AddWithValue("@Name", name); |
| Java / JDBC | stmt.executeQuery("SELECT * FROM Users WHERE Name = '" + name + "'"); | ps = conn.prepareStatement("SELECT * FROM Users WHERE Name = ?"); ps.setString(1, name); |
| Python / pyodbc | cursor.execute(f"SELECT * FROM Users WHERE Name = '{name}'") | cursor.execute("SELECT * FROM Users WHERE Name = ?", name) |
| PHP / PDO | $pdo->query("SELECT * FROM Users WHERE Name = '$name'"); | $stmt = $pdo->prepare("SELECT * FROM Users WHERE Name = ?"); $stmt->execute([$name]); |
| Node.js / mssql | await pool.query(`SELECT * FROM Users WHERE Name = '${name}'`) | await pool.request().input('name', sql.NVarChar, name).query('SELECT * FROM Users WHERE Name = @name') |
覆蓋範圍:所有動態 SQL 構建點,包括 WHERE、ORDER BY、IN 列表、LIKE 模糊匹配、存儲過程動態 SQL(sp_executesql 參數化)。
第二步:最小權限與攻擊面縮減—— 限制損害半徑
- 數據庫賬號分級:Web 應用僅用
db_datareader/db_datawriter + 執行存儲過程權限,禁止 sysadmin、db_owner、BACKUP、xp_cmdshell。
- 禁用/移除危險擴展:
sp_configure 'xp_cmdshell', 0; RECONFIGURE;、Ole Automation Procedures、Ad Hoc Distributed Queries。
- 錯誤信息不外泄:生產環境關閉詳細錯誤頁面,統一返回友好提示,日誌記錄完整堆棧供內部排查。
- 輸入長度/格式限制:前後端雙重驗證,如用戶名僅允許字母數字下劃線 20 字符,拒絕超長/特殊字符輸入。
第三步:主動檢測與運行時防護—— 捕獲殘留風險
- WAF (Web Application Firewall):部署 ModSecurity + OWASP CRS 規則集,攔截含
UNION SELECT、OR 1=1、WAITFOR DELAY、0x 十六進制等特徵的請求。
- SQL Server 審計/擴展事件:記錄失敗登錄、權限提升、動態 SQL 執行、大量錯誤返回等異常模式。
- 自動化掃描:CI/CD 流水線集成 SAST(代碼靜態分析)、DAST(動態掃描)、IAST(交互式掃描),發布前強制門禁。
- 蜜罐賬號/欺騙技術:創建高權限誘餌賬號,觸發即告警,延緩攻擊者偵察節奏(文中提到的「大字段誘餌」屬此類,但不建議作為主要防線,易被智能掃描器識別)。
進階防禦:存儲過程封裝 + 動態 SQL 安全模式
CREATE PROC dbo.usp_GetUserByName
@Name NVARCHAR(50)
WITH EXECUTE AS CALLER -- 權限上下文控制
AS
BEGIN
SET NOCOUNT ON;
-- 參數化動態 SQL(即使在存儲過程內也要參數化!)
DECLARE @Sql NVARCHAR(MAX) = N'SELECT Id, Name, Email FROM dbo.Users WHERE Name = @Name';
EXEC sp_executesql @Sql, N'@Name NVARCHAR(50)', @Name = @Name;
END
應急響應清單
- 發現注入 → 立即封禁攻擊源 IP、撤銷受影響賬號權限。
- 審計日誌回溯 → 確定數據洩露範圍、是否植入 Webshell/後門。
- 修復代碼 → 參數化所有動態 SQL、補丁部署。
- 通報合規部門 → 評估 GDPR/個信法報告義務。
- 全量掃描 → 排查同類漏洞、更新 WAF 規則。
SQL 注入防禦沒有銀彈,參數化查詢是根基,最小權限是護盾,持續監控是利劍。將三步走策略內化為團隊開發規範、代碼評審清單、CI/CD 門禁標準,才能在源頭斬斷注入攻擊鏈。
- 上一篇文章: Web環境下 SQL Server 數據磁帶備份與恢復實戰指南
- 下一篇文章: SQL Server 水平/垂直分庫分表:向外擴展架構設計與工程落地指南
Copyright ©
程式碼之家 All Rights Reserved