2011-09-02 16:59:26nut
[技術]SQL Injection原理與參數化查詢語法
資料來源:http://blog.faq-book.com/?p=2622
ADO.NET 安全程式碼撰寫方針
使用參數化查詢
SQL Injection 解釋與防範
實務上檢測工具
Microsoft Source Code Analyzer for SQL Injection (MSCASI) 與 URLScan 3.0。
原因
在應用程式中若有下列狀況,則可能應用程式正暴露在SQL Injection的高風險情況下:
在應用程式中使用字串聯結方式組合SQL指令。
在應用程式連結資料庫時使用權限過大的帳戶(例如很多開發人員都喜歡用sa(內建的最高權限的系統管理員帳戶)連接Microsoft SQL Server資料庫)。
在資料庫中開放了不必要但權力過大的功能(例如在Microsoft SQL Server資料庫中的xp_cmdshell延伸預存程式或是OLE Automation預存程式等)
太過於信任使用者所輸入的資料,未限制輸入的字元數,以及未對使用者輸入的資料做潛在指令的檢查。
作用原理
SQL命令可查詢、插入、更新、刪除等,命令的串接。而以分號字元為不同命令的區別。(原本的作用是用於SubQuery或作為查詢、插入、更新、刪除……等的條件式)
SQL命令對於傳入的字串參數是用單引號字元所包起來。〈但連續2個單引號字元,在SQL資料庫中,則視為字串中的一個單引號字元〉
SQL命令中,可以夾帶註解〈連續2個減號字元——後的文字為註解,或「/*」與「*/」所包起來的文字為註解〉
因此,如果在組合SQL的命令字串時,未針對單引號字元作取代處理的話,將導致該字元變數在填入命令字串時,被惡意竄改原本的SQL語法的作用。
避免的方法
在設計應用程式時,完全使用參數化查詢(Parameterized Query)來設計資料存取功能。
在組合SQL字串時,先針對所傳入的參數作字元取代(將單引號字元取代為連續2個單引號字元)。
如果使用PHP開發網頁程式的話,亦可開啟PHP的魔術引號(Magic quote)功能(自動將所有的網頁傳入參數,將單引號字元取代為連續2個單引號字元)。
其他,使用其他更安全的方式連接SQL資料庫。例如已修正過SQL資料隱碼問題的資料庫連接元件,例如ASP.NET的SqlDataSource 物件或是 LINQ to SQL。
使用SQL防資料隱碼系統。
--===================================
參數化寫法指令
ADO.NET 安全程式碼撰寫方針
使用參數化查詢
SQL Injection 解釋與防範
實務上檢測工具
Microsoft Source Code Analyzer for SQL Injection (MSCASI) 與 URLScan 3.0。
原因
在應用程式中若有下列狀況,則可能應用程式正暴露在SQL Injection的高風險情況下:
在應用程式中使用字串聯結方式組合SQL指令。
在應用程式連結資料庫時使用權限過大的帳戶(例如很多開發人員都喜歡用sa(內建的最高權限的系統管理員帳戶)連接Microsoft SQL Server資料庫)。
在資料庫中開放了不必要但權力過大的功能(例如在Microsoft SQL Server資料庫中的xp_cmdshell延伸預存程式或是OLE Automation預存程式等)
太過於信任使用者所輸入的資料,未限制輸入的字元數,以及未對使用者輸入的資料做潛在指令的檢查。
作用原理
SQL命令可查詢、插入、更新、刪除等,命令的串接。而以分號字元為不同命令的區別。(原本的作用是用於SubQuery或作為查詢、插入、更新、刪除……等的條件式)
SQL命令對於傳入的字串參數是用單引號字元所包起來。〈但連續2個單引號字元,在SQL資料庫中,則視為字串中的一個單引號字元〉
SQL命令中,可以夾帶註解〈連續2個減號字元——後的文字為註解,或「/*」與「*/」所包起來的文字為註解〉
因此,如果在組合SQL的命令字串時,未針對單引號字元作取代處理的話,將導致該字元變數在填入命令字串時,被惡意竄改原本的SQL語法的作用。
避免的方法
在設計應用程式時,完全使用參數化查詢(Parameterized Query)來設計資料存取功能。
在組合SQL字串時,先針對所傳入的參數作字元取代(將單引號字元取代為連續2個單引號字元)。
如果使用PHP開發網頁程式的話,亦可開啟PHP的魔術引號(Magic quote)功能(自動將所有的網頁傳入參數,將單引號字元取代為連續2個單引號字元)。
其他,使用其他更安全的方式連接SQL資料庫。例如已修正過SQL資料隱碼問題的資料庫連接元件,例如ASP.NET的SqlDataSource 物件或是 LINQ to SQL。
使用SQL防資料隱碼系統。
--===================================
參數化寫法指令
' Retrieve CustomerID to search for.
Dim ID As String = TextBox1.Text
Dim query As String = _
"SELECT * FROM Orders WHERE CustomerID = @CustomerID"
Dim cmd As SqlCommand = New SqlCommand(query, conn)
cmd.Parameters.Add("@CustomerID", SqlDbType.VarChar, 5).Value = ID
' Code connecting to a data source has been omitted for brevity.
Dim reader As SqlDataReader = cmd.ExecuteReader()
' Process results.
reader.Close()
很讚的分享!
http://www.yyj.tw/