在我的应用程序中,我像这样使用string.Format()
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
?
答案 0 :(得分:8)
使用参数化查询:
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
答案 1 :(得分:3)
防止SQL注入的唯一完全安全的方法是不允许用户提供的数据进入实际的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
,但代码对于其他提供者看起来并没有太大的不同,并且概念是相同的)