-- VBScript/ASP 典型寫法
Sql = "SELECT * FROM Users WHERE Username = '" + name + "' AND Password = '" + passWord + "'"
若使用者輸入 name = "111' OR '1'='1",passWord = "aaaa",實際執行 SQL 變為:
SELECT * FROM Users WHERE Username = '111' OR '1'='1' AND Password = 'aaaa'
因 '1'='1' 永真,OR 短路導致密碼檢查被忽略,任意密碼即可登入。
知名網路遊戲《笑傲江湖》早期版本即存在此漏洞,導致大量帳號被盜。許多教學書範例程式碼亦未防範,誤導初學者。
Sql = "SELECT * FROM Users WHERE Username = @Username AND Password = @Password"
Cmd.Parameters.Add("@Username", name)
Cmd.Parameters.Add("@Password", passWord)
資料永遠不會被視為 SQL 指令一部分。
SELECT 權限。「看似微小的疏漏可能造成災難性後果。」安全意識必須貫穿整個開發週期:設計威脅模型、程式碼審查、滲透測試、上線後持續監控。參數化查詢是現代資料庫存取的基礎素養,無例外。