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 等。
'' 替換 ',使攻擊字串變成字面值。--、/* */,防止截斷後段 SQL。-- 參數化查詢範例
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);
帳號欄位最長 10 碼,前後端同步驗證 maxlength="10",大幅縮減攻擊載荷空間。
RegularExpressionValidator、CustomValidator 攔截明顯非法字元。密碼儲存前以 FormsAuthentication.HashPasswordForStoringInConfigFile(pwd, "SHA1") 雜湊,驗證時比對雜湊值。即使資料庫外洩,攻擊者亦難逆向明文。
單筆查詢(如登入)預期回傳 0 或 1 列,若 >1 列視為異常拒絕,防止 OR '1'='1 導致多筆匹配。
| 層次 | 措施 | 成效 |
|---|---|---|
| 1 | 參數化查詢 / SP | 根治注入 |
| 2 | 最小權限帳號 | 限縮破壞範圍 |
| 3 | 輸入驗證+長度限制 | 阻擋明顯攻擊 |
| 4 | 密碼加鹽雜湊 | 資料外洩無害 |
| 5 | 結果筆數檢核 | 偵測異常查詢 |
| 6 | WAF/日誌稽核 | 事後追蹤封鎖 |
「參數化查詢」是唯一銀彈;其他措施屬縱深防禦,缺一不可。