使用SQL Data Reader C#进行参数化查询

3
我知道非参数化查询因为 SQL 注入而不被看好。然而,我的应用程序有很多容易受到 SQL 注入的查询。我只是似乎无法理解如何使用 SqlDataReader 做到这一点。我能够使用 ExecuteNonQuery,但不能使用 SQLDataReader。
有人可以给我一些提示或示例来解决这个问题吗?查询正在执行并返回确切的结果,我只想尽可能地使其安全....
代码:
string myQuery = "Select [shoeSize] AS 'Shoe Size', [shoeBrand] AS 'Shoe Brand' FROM [myTable] "
                 + "WHERE [customerName] = '" + customer + "' AND " + "[customerPin] = '" + customerID + "'";

 sqlCmd = new SqlCommand(myQuery, conn);
 sqlCmd.Connection.Open();
 SqlDataReader rdr2 = sqlCmd.ExecuteReader();

  if (rdr2.HasRows)
     {
        rdr2.Read();

        shoeSize= rdr2["Shoe Size"].ToString();       
        shoeBrand= rdr2["Shoe Brand"].ToString();
     }
     conn.close();

1
在生成 SQL 查询文本时,不应使用字符串连接或字符串格式化,而应使用 sqlCmd.Parameters.Add(...)。 - Oleg
“frowned upon” 是今年的委婉说法… - Thorsten Dittmar
@oleg 你真的读过他的问题吗? - Thorsten Dittmar
@ThorstenDittmar 是的,有什么问题吗? - Oleg
@Oleg的问题是如何将非参数化查询转换为参数化查询,而你告诉他不要使用字符串拼接/格式化来构建查询?这让我觉得你可能没有读懂他在问什么。 - Thorsten Dittmar
2个回答

5

这里是你需要的内容。

string myQuery = "Select [shoeSize] AS 'Shoe Size', [shoeBrand] AS 'Shoe Brand' FROM [myTable] "
                 + "WHERE [customerName] = @customerName AND [customerPin] = @customerID"

 sqlCmd = new SqlCommand(myQuery, conn);
 sqlCmd.Connection.Open();
 sqlCmd.Parameters.AddWithValue("@customerName", customerName);
 sqlCmd.Parameters.AddWithValue("@customerID", customerID");
 --rest stays the same as before

现在你的参数是@customerName和@customerID。因此,即使客户的名称类似于“Bigler,Fabian' DROP TABLE [myTable]”,它也不起作用。它完全消除了“恶意”输入改变查询含义的可能性。

非参数化查询不仅仅是被“ frowned upon”。它对你、你的公司和 - 当然 - 你的客户可能带来灾难性后果。


1
谢谢!那完美地回答了它。 - codeBoy
然而,人们仍然发布基于NHibernate和Entity Framework的应用程序以继续运行。唉。 - Po-ta-toe

2

像这样:

        string myQuery = "Select [shoeSize] AS 'Shoe Size', [shoeBrand] AS 'Shoe Brand' FROM [myTable] "
              + "WHERE [customerName] = @customerName AND [customerPin] = @customerPin";

        sqlCmd = new SqlCommand(myQuery, conn);
        sqlCmd.Connection.Open();
        sqlCmd.Parameters.Add("@customerName", SqlDbType.NVarChar, 50).Value = customer;
        sqlCmd.Parameters.Add("@customerPin", SqlDbType.NVarChar, 20).Value = customerID;
        SqlDataReader rdr2 = sqlCmd.ExecuteReader();

        if (rdr2.HasRows)
        {
            rdr2.Read();

            shoeSize = rdr2["Shoe Size"].ToString();
            shoeBrand = rdr2["Shoe Brand"].ToString();
        }
        conn.close();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接