String.Format和SQL请求

时间:2011-03-14 17:53:25

标签: .net sql string sql-injection

在我的应用程序中,我像这样使用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

2 个答案:

答案 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,但代码对于其他提供者看起来并没有太大的不同,并且概念是相同的)