首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL 注入漏洞成因與修補:VB/ADO 登入繞過實測與參數化防禦

     編輯:關於SqlServer

漏洞重現

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"

輸入:

  • 帳號:123
  • 密碼:a' OR 'a'='a

實際 SQL:

SELECT * FROM users WHERE name='123' AND pwd='a' OR 'a'='a'

'a'='a' 恆真,只要表有資料即通過驗證。

漏洞特徵

  1. 跨語言/技術:VB、Delphi、ASP、JSP、PHP、Java 皆可能中招。
  2. 隱蔽性:正常功能測試不易發現,僅特定輸入觸發。
  3. 危害性:零成本繞過認證,進而竊取/竄改/刪除資料。

修補方案

1. 參數化查詢 (根治)

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

參數化將使用者輸入視為資料而非程式碼,徹底阻斷注入。

2. 輸入過濾 (輔助)

  • 密碼禁止空白字元。
  • 密碼加密儲存(雜湊 + 鹽),驗證時比對雜湊值,原始密碼不進 SQL。
  • 白名單驗證:帳號僅允許英數字、底線,長度限制。

3. 最小權限資料庫帳號

應用程式連線布號僅擁有 users 表的 SELECT 權限,無 INSERT/UPDATE/DELETE、無 sysadmin、無 xp_cmdshell 執行權。

進階防禦

  • 使用 ORM/參數化框架(Entity Framework、Dapper、Hibernate 等)統一資料存取層。
  • 部署資料庫稽核/防火牆偵測異常 SQL 模式。
  • 定期程式碼審查與滲透測試。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved