2011-03-14 63 views
1

在我的應用程序使用的String.format()對於這樣的SQL的String.Format和SQL請求

Dim strSQL As String = "SELECT X FROM MY_TABLE WHERE Y <> {0} AND Z = '{1}'" 
    strSQL = String.Format(strSQL, otherObj.Y, myObj.Z) 

有一天,我做了使用SQL注入(帶引號PARAMS一個全球性的「壓力」測試,和這樣的東西),並發現了很多錯誤...

什麼是最好的方式在.NET中「打」它呢?是否有一個String.Format或其他常見的方式來正確(和安全地)在SQL查詢中使用SQL參數。

你會推薦什麼取代String.Format

回答

3

唯一完全安全的方式是不允許用戶提供的數據到您的實際的SQL語句。相反,通過參數提供可變數據(例如您在格式字符串中使用的令牌)。

例如,

Using cmd As yourConnection.CreateCommand() 
    cmd.CommandText = "select x from my_table where y <> @y and z = @z" 

    cmd.Parameters.AddWithValue("@y", otherObj.Y) 
    cmd.Parameters.AddWithValue("@z", myObj.Z) 

    // etc. 
End Using 

(利用的AddWithValue假定這是一個SqlConnection,但代碼不查找其他提供太大的不同,和概念是相同的)

8

改爲使用參數化查詢:防止SQL注入

Using conn as new SqlConnection(connString) 

    Dim command As new SqlCommand("select x from my_table " + & _ 
     "where y <> @param1 and z = @param2", conn); 

    command.Parameters.Add(new SqlParameter("@param1", otherObj.Y)); 
    command.Parameters.Add(new SqlParameter("@param2", myObj.Z)); 

    ' Execute the command and get results 

End Using 
+0

的OP的代碼是VB.NET,但概念應該清楚。 – 2011-03-14 17:59:01