典型登入驗證代碼 (VB6 + ADO):
sqlstr = "SELECT * FROM users WHERE name='" & Text1.Text & "' AND pwd='" & Text2.Text & "'"
Set adors = Adocon.Execute(sqlstr)
If adors.RecordCount > 0 Then MsgBox "Pass" Else MsgBox "Fail"
輸入:
用戶名:123
密碼:a' OR 'a'='a
實際執行 SQL 變為:
SELECT * FROM users WHERE name='123' AND pwd='a' OR 'a'='a'
'a'='a' 永真,繞過驗證直接登入。
DROP TABLE、xp_cmdshell 等危險操作。-- VB6 ADO 範例
cmd.CommandText = "SELECT * FROM users WHERE name=? AND pwd=?"
cmd.Parameters.Append cmd.CreateParameter("name", adVarChar, adParamInput, 50, Text1.Text)
cmd.Parameters.Append cmd.CreateParameter("pwd", adVarChar, adParamInput, 50, Text2.Text)
Set rs = cmd.Execute
參數與代碼分離,資料庫將輸入視為字面值而非 SQL 片段。
將邏輯封裝於伺服器端,應用僅呼叫 EXEC sp_login @name, @pwd,同樣享受參數化保護。
-- 先查用戶是否存在
SELECT pwd_hash FROM users WHERE name = ?
-- 應用層比對雜湊值
雖不如參數化徹底,但能阻擋最簡單的 OR 'a'='a 攻擊。
SELECT/INSERT/UPDATE/DELETE,禁止 DROP、EXECUTE 等高危權限。SQL 注入已知超過 20 年,仍是 OWASP Top 10 常客。根源不在資料庫,而在應用層「代碼與資料未分離」。養成參數化習慣,才是唯一銀彈。