萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 電腦基礎知識 >  >> 健康知識

ASP.NET 防禦 SQL 注入攻擊完整指南:從原理到七大防護實務

一、什麼是 SQL 注入攻擊?

攻擊者在 Web 表單輸入欄位或查詢字串植入 SQL 指令,欺騙伺服器執行惡意查詢。典型情境:登入頁面將使用者輸入直接拼接成動態 SQL:

StringBuilder query = new StringBuilder("SELECT * FROM Users WHERE login = '");
query.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、INSERT 等破壞操作。

二、七大防禦實務(由淺入深)

1. 動態 SQL 輸入過濾(三招組合)

  • 單引號加倍: 將 ' 替換為 '',破壞注入語法結構。
  • 移除註釋符號: 刪除 --、/* */ 等,防止截斷後段查詢。
  • 最小權限原則: 不同操作(查詢/新增/修改/刪除)使用不同資料庫帳號,限制各帳號僅能執行對應指令。

2. 全面採用預存程序 + 參數化查詢

參數傳遞機制天然免疫單引號與註釋符號注入;資料庫權限可精細限制至「僅能執行特定預存程序」,大幅縮小攻擊面。

3. 限制輸入長度

帳號欄位若僅需 10 碼,前後端同步限制 maxlength=10,物理上阻擋長注入碼。

4. 雙重驗證:客戶端 + 伺服器端

  • 客戶端:使用 RegularExpressionValidator 等內建驗證控制項,自動產生腳本。
  • 伺服器端:必須 再次驗證,因攻擊者可繞過瀏覽器直接送出惡意 POST。若無現成驗證器,可自訂 CustomValidator。

5. 敏感資料加密儲存(雜湊而非加密)

密碼以 FormsAuthentication.HashPasswordForStoringInConfigFile 雜湊儲存;驗證時比對雜湊值。使用者輸入經雜湊後失去 SQL 特殊意義,徹底斷開注入路徑。

6. 檢查回傳筆數

預期單筆查詢(如登入),若回傳 >1 筆,視為異常拒絕授權。

7. 參數化查詢範例(ADO.NET)

SqlCommand cmd = new SqlCommand("SELECT * FROM Users WHERE login=@u AND pwd=@p", conn);
cmd.Parameters.AddWithValue("@u", txtLogin.Text);
cmd.Parameters.AddWithValue("@p", txtPassword.Text);

參數化查詢與預存程序同屬「查詢與資料分離」範式,是現代 ASP.NET 開發的標準作法。

結語

SQL 注入防禦無單一銀彈,需結合「輸入驗證、參數化查詢、最小權限、加密儲存、異常監控」多層防護。養成安全編碼習慣,比事後修補更具成效。

copyright © 萬盛學電腦網 all rights reserved