2013-03-23 36 views
0

我對如何防止SQL injectiion與參數化查詢SQL注入,使用參數化的查詢

sqlQuery="SELECT * FROM usersTbl WHERE [email protected] AND [email protected]"; 
SqlCommand cmd = new SqlCommand(sqlQuery, conn); 

SqlParameter[] par = new MySqlParameter[2]; 

par[0] = new SqlParameter("@uname ", SqlDbType.VarChar,25); 
par[1] = new SqlParameter("@passwd", SqlDbType.VarChar, 45); 

然後我將它們連接到的SqlCommand和它的ExecuteScalar的幫助下一些問題。

例如客戶端插入字符串;DROP --在密碼變量,將參數化查詢防止被執行DROP查詢?

謝謝

+1

你嘗試了嗎? – 2013-03-23 17:00:10

回答

4

當然,當客戶端通過在密碼字段';DROP --值,這將被解析成

SELECT * 
FROM usersTbl 
WHERE [email protected] AND password=''';DROP --' 

command對象將自動逸出上的值中發現的任何單引號。

更新1

正如,我已經告訴你,它不會。因爲引號會加倍報價而逃脫。例如,

string pass_val = "'; DROP usersTbl;--"; 

當你通過了爲命令,它的值是參數,這將成爲

SELECT * FROM usersTbl WHERE ... AND password='''; DROP usersTbl;--' 

和NOT

SELECT * FROM usersTbl WHERE ... AND password=''; DROP usersTbl;-- 
+0

SELECT * FROM usersTbl WHERE username = @ uname AND password =''; DROP usersTbl; - 所以@passwd參數是''; DROP usersTbl; - 。它會執行它嗎?因爲#passwd是VarChar(字符串) – user1501674 2013-03-23 17:16:33

+0

請參閱我的更新。簡短的回答,**沒有**。 – 2013-03-23 17:25:47

+0

參數化查詢與轉義查詢值不同。在使用參數化查詢時,參數和實際查詢是兩個不同的部分。 – Matthew 2013-03-23 17:27:01

1

是的,參數化查詢將正確地轉義任何允許發生這種情況的字符。