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

SQL 語句密碼驗證經典漏洞:注入攻擊原理與修補方案

     編輯:關於SqlServer

脆弱程式碼範例

-- 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 短路導致密碼檢查被忽略,任意密碼即可登入。

真實案例

知名網路遊戲《笑傲江湖》早期版本即存在此漏洞,導致大量帳號被盜。許多教學書範例程式碼亦未防範,誤導初學者。

修補方案 (由優至劣)

  1. 參數化查詢 (唯一根治):
    Sql = "SELECT * FROM Users WHERE Username = @Username AND Password = @Password"
    Cmd.Parameters.Add("@Username", name)
    Cmd.Parameters.Add("@Password", passWord)
    
    資料永遠不會被視為 SQL 指令一部分。
  2. 預存程序 + 參數:將驗證邏輯封裝於 SP,應用層僅呼叫 SP 並傳參數。
  3. 輸入驗證/過濾 (輔助):拒絕單引號、分號、註解符號等,但不能替代參數化查詢 (繞過手法多樣)。
  4. 最小權限資料庫帳號:Web 應用帳號僅擁有必要資料表的 SELECT 權限。

開發者警示

「看似微小的疏漏可能造成災難性後果。」安全意識必須貫穿整個開發週期:設計威脅模型、程式碼審查、滲透測試、上線後持續監控。參數化查詢是現代資料庫存取的基礎素養,無例外。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved