天天看點

SQL注入常見的安全問題

SQL注入是一個安全問題,因為應用程式使用拼接SQL的技術而成為hacker攻擊背景的方式。下面就介紹一下2種SQL注入,及解決SQL注入的方法。

1.基于 1=1 總為真

SQL注入常見的安全問題
SELECT * FROM Users WHERE UserId = 105 OR 1=1;
           

隻需在輸入字段中插入105或1=1,就可以通路資料庫中的所有使用者名和密碼。

2.标題基于批處理SQL

SQL注入常見的安全問題
SELECT * FROM Users WHERE UserId = 105; DROP TABLE Suppliers;
           

删除表Suppliers,很明顯對資料庫進行破壞,可能造成背景癱瘓。

3.模糊查詢注入a%’ exec master…xp_cmdshell ‘net user test testpass /ADD’

sql:="SELECT * FROM products WHERE name LIKE '%"+prod+"%'"
Db.Exec(sql)
           

如果攻擊送出 a%’ exec master…xp_cmdshell ‘net user test testpass /ADD’ – 作為變量 prod的值,那麼sql将會變成

sql:="SELECT * FROM products WHERE name LIKE '%a%' exec master..xp_cmdshell 'net user test testpass /ADD'--%'"
           

伺服器會執行這條SQL語句,包括它後面那個用于向系統添加新使用者的指令。 如果這個程式是以sa運作而 資料庫服務又有足夠的權限的話,攻擊者就可以獲得一個系統帳号來通路主機了

預防SQL注入

  1. 嚴格限制Web應用的資料庫的操作權限,給此使用者提供僅僅能夠滿足其工作的最低權限,進而最大限度的減少注入攻擊對資料庫的危害。
  2. 檢查輸入的資料是否具有所期望的資料格式,嚴格限制變量的類型,例如使用regexp包進行一些比對處理, 或者使用strconv包對字元串轉化成其他基本類型的資料進行判斷。
  3. 對進入資料庫的特殊字元(’”尖括号&*;等)進行轉義處理,或編碼轉換。
  4. 所有的查詢語句建議使用資料庫提供的參數化查詢接口,參數化的語句使用參數而不是将使用者輸入變量嵌入到SQL語句中, 比如Java中的PrepareStatement。
  5. 在應用釋出之前建議使用專業的SQL注入檢測工具進行檢測, 以及時修補被發現的SQL注入漏洞。網上有很多這方面的開源工具,例如sqlmap、SQLninja等。
  6. 避免網站列印出SQL錯誤資訊,比如類型錯誤、字段不比對等,把代碼裡的SQL語句暴露出來,以防止攻擊者利用這些錯誤資訊進行SQL注入