2015-06-16 72 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(); 
相關問題