SQL注入,使用参数化查询

时间:2013-03-23 16:58:27

标签: c# asp.net mysql sql sql-injection

我有一些关于如何借助参数化查询来防止sql注入的问题

sqlQuery="SELECT * FROM usersTbl WHERE username=@uname AND password=@passwd";
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查询执行

谢谢

2 个答案:

答案 0 :(得分:4)

当然,当客户端在密码字段中传递';DROP --值时,这将被解析为

SELECT * 
FROM usersTbl 
WHERE username=@uname AND password=''';DROP --'

command对象将自动转义在值上找到的任何单引号。

更新1

因为,我已经告诉过你,它不会。因为报价将通过加倍报价来转义。例如,

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

当您将其传递给命令并且其值已参数化时,这将变为

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

而不是

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

答案 1 :(得分:1)

是的,参数化查询将正确地转义任何允许这种情况发生的字符。