攻擊者在 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 等破壞操作。
' 替換為 '',破壞注入語法結構。--、/* */ 等,防止截斷後段查詢。參數傳遞機制天然免疫單引號與註釋符號注入;資料庫權限可精細限制至「僅能執行特定預存程序」,大幅縮小攻擊面。
帳號欄位若僅需 10 碼,前後端同步限制 maxlength=10,物理上阻擋長注入碼。
RegularExpressionValidator 等內建驗證控制項,自動產生腳本。CustomValidator。密碼以 FormsAuthentication.HashPasswordForStoringInConfigFile 雜湊儲存;驗證時比對雜湊值。使用者輸入經雜湊後失去 SQL 特殊意義,徹底斷開注入路徑。
預期單筆查詢(如登入),若回傳 >1 筆,視為異常拒絕授權。
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 注入防禦無單一銀彈,需結合「輸入驗證、參數化查詢、最小權限、加密儲存、異常監控」多層防護。養成安全編碼習慣,比事後修補更具成效。