首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

ASP.NET 防禦 SQL 注入攻擊完整指南

     編輯:關於SqlServer

SQL 注入是 Web 應用最常見、破壞力最大的攻擊之一。攻擊者透過表單輸入或查詢字串植入惡意 SQL 片段,竊改查詢邏輯,繞過驗證、竊取資料、甚至執行系統命令。本文系統說明攻擊原理與六大防禦層次。

攻擊原理速覽

登入頁面直接拼接使用者輸入:

StringBuilder query = new StringBuilder("SELECT * FROM Users WHERE login = '")
    .Append(txtLogin.Text).Append("' AND password='")
    .Append(txtPassWord.Text).Append("'");

攻擊者輸入 ' OR '1'='1,最終 SQL 變為:

SELECT * FROM Users WHERE login = '' OR '1'='1' AND password = '' OR '1'='1'

條件恆真,繞過驗證。若連線帳號具高權限,攻擊者可 DROP TABLE、xp_cmdshell 等。

六大防禦策略(由淺入深)

1. 動態 SQL 輸入過濾(最後防線)

  • 單引號加倍:'' 替換 ',使攻擊字串變成字面值。
  • 移除註解符:刪除 --、/* */,防止截斷後段 SQL。
  • 限制帳號權限:查詢、新增、修改、刪除使用不同資料庫帳號,實踐最小權限原則。

2. 全面採用參數化查詢 / 預存程序(核心防禦)

-- 參數化查詢範例
SqlCommand cmd = new SqlCommand("SELECT * FROM Users WHERE login=@login AND password=@pwd", conn);
cmd.Parameters.AddWithValue("@login", txtLogin.Text);
cmd.Parameters.AddWithValue("@pwd", txtPassWord.Text);
  • 參數視為資料而非程式碼,徹底杜絕注入。
  • 預存程序進一步將邏輯封裝於資料庫,權限可精確到「僅能執行特定 SP」。

3. 限制輸入長度

帳號欄位最長 10 碼,前後端同步驗證 maxlength="10",大幅縮減攻擊載荷空間。

4. 雙重驗證:前端 + 後端

  • 前端:RegularExpressionValidator、CustomValidator 攔截明顯非法字元。
  • 後端:必須 在伺服器端再次驗證,因攻擊者可繞過瀏覽器直接送惡意請求。

5. 敏感資料加密儲存(縱深防禦)

密碼儲存前以 FormsAuthentication.HashPasswordForStoringInConfigFile(pwd, "SHA1") 雜湊,驗證時比對雜湊值。即使資料庫外洩,攻擊者亦難逆向明文。

6. 結果集筆數檢核

單筆查詢(如登入)預期回傳 0 或 1 列,若 >1 列視為異常拒絕,防止 OR '1'='1 導致多筆匹配。

總結清單

層次措施成效
1參數化查詢 / SP根治注入
2最小權限帳號限縮破壞範圍
3輸入驗證+長度限制阻擋明顯攻擊
4密碼加鹽雜湊資料外洩無害
5結果筆數檢核偵測異常查詢
6WAF/日誌稽核事後追蹤封鎖

「參數化查詢」是唯一銀彈;其他措施屬縱深防禦,缺一不可。

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