首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL 注入攻擊原理與參數化查詢防禦實戰

     編輯:MySQL 資料庫相關知識

SQL 注入是 Web 應用最頂級的安全風險之一。本文通過實例拆解注入原理,演示字符串拼接的危害,並給出 ADO.NET / mysqli / PDO 參數化查詢的統一防禦模式。

一、注入攻擊還原現場

典型登錄查詢(字符串拼接):

string strSql = "SELECT * FROM Users WHERE UserName='" + txtUser.Text
              + "' AND UserPass='" + txtPass.Text + "'";

攻擊者在用戶名輸入:1' OR '1'='1 --

生成 SQL:

SELECT * FROM Users WHERE UserName='1' OR '1'='1 --' AND UserPass='...'

-- 註釋掉後續條件,'1'='1' 永真,繞過驗證並返回首行數據(通常是管理員)。

二、參數化查詢:根治方案

核心原則:代碼與數據分離。參數不作為 SQL 文本拼接,而是作為獨立對象傳遞給資料庫引擎解析,徹底消除注入面。

ADO.NET (C#) 範例

using (var cn = new SqlConnection(connStr))
using (var cmd = cn.CreateCommand()) {
    cmd.CommandText = "SELECT * FROM Users WHERE UserName=@UserName AND UserPass=@UserPass";
    cmd.Parameters.AddWithValue("@UserName", txtUser.Text);
    cmd.Parameters.AddWithValue("@UserPass", txtPass.Text);
    cn.Open();
    using (var rd = cmd.ExecuteReader()) { /* ... */ }
}

PHP mysqli 範例

$stmt = $mysqli->prepare("SELECT * FROM Users WHERE UserName=? AND UserPass=?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
$result = $stmt->get_result();

PHP PDO 範例(推薦,支援多種資料庫)

$stmt = $pdo->prepare("SELECT * FROM Users WHERE UserName=:u AND UserPass=:p");
$stmt->execute([':u' => $username, ':p' => $password]);
$user = $stmt->fetch();

三、輔助防禦層(纏深層防禦)

措施說明局限性
輸入長度限制maxlength、服務端長度校驗無法阻擋短 Payload 攻擊
特殊字符轉義/過濾mysqli_real_escape_string、WAF 規則編碼繞過、上下文敏感(如 LIKE 子句)
最小權限賬號應用賃戶僅授 SELECT/INSERT/UPDATE,禁 DROP/GRANT無法防範數據竊取
錯誤信息隱藏生產環境關閉詳細 SQL 錯誤回顯不解決根因,僅增加攻擊成本

四、存儲過程同樣需要參數化

-- 錯誤:動態 SQL 拼接
CREATE PROC GetUser @name VARCHAR(50) AS
EXEC('SELECT * FROM Users WHERE Name=''' + @name + '''');

-- 正確:參數化
CREATE PROC GetUser @name VARCHAR(50) AS
SELECT * FROM Users WHERE Name = @name;

五、總結

  • ✅ 永遠使用參數化查詢 / 預處理語句——唯一根治方案。
  • ✅ 所有外部輸入(GET/POST/Cookie/Header/文件上傳)視為不受信。
  • ✅ ORM 框架(EF、Hibernate、Eloquent、Doctrine)內建參數化,優先使用。
  • ✅ 定期掃描代碼庫搜尋 + . || 等拼接操作符出現在 SQL 字符串中。

參數化查詢不僅安全,還能利用執行計劃緩存提升效能。將其作為團隊編碼規範的強制項,是構建安全應用的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved