2015-06-16 51 views
3

我知道,非参数化查询因SQL注入而被忽视。那么,我的应用程序中有很多查询容易受到SQL注入的影响。我似乎无法用SqlDataReader来包裹我的头。我可以用ExecuteNonQuery而不是SQLDataReader使用SQL数据读取器进行参数化查询C#

有人可以给我一些指点和或要做到这一点的最佳方式的例子,执行查询时,返回正是它应该,我只是想使它尽可能的安全....

代码:

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

如果您调用ExecuteReader()或ExecuteNonQuery(),则无关紧要。这是一样的,所以如果你知道如何做到这一点,你可以与其他人做。参考:[在SQL语句中使用参数](http://stackoverflow.com/questions/7505808/using-parameters-in-sql-statements) –

+1

您不应该使用字符串连接或字符串格式来生成sql查询文本,而是使用sqlCmd.Parameters.Add(...) – Oleg

+0

*皱眉*是今年的委婉说法...... –

回答

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]”,它也不会起作用。它完全消除了“邪恶”输入改变查询含义的可能性。

非参数化查询不是简单地'皱眉'。这对您,您的公司和 - 当然是您的客户可能是灾难性的。

+1

谢谢!这完美地回答了它 – codeBoy

+0

然而人们仍然释放nhibernate和基于实体框架的应用程序。叹。 –

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(); 
相关问题