VB + 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"
輸入:
123a' OR 'a'='a實際 SQL:
SELECT * FROM users WHERE name='123' AND pwd='a' OR 'a'='a'
'a'='a' 恆真,只要表有資料即通過驗證。
Dim cmd As New ADODB.Command
cmd.ActiveConnection = Adocon
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 Adors = cmd.Execute
參數化將使用者輸入視為資料而非程式碼,徹底阻斷注入。
應用程式連線布號僅擁有 users 表的 SELECT 權限,無 INSERT/UPDATE/DELETE、無 sysadmin、無 xp_cmdshell 執行權。