0

我有一些关于如何在参数化查询的帮助下防止 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查询被执行吗?

谢谢

4

2 回答 2

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;--
于 2013-03-23T17:00:48.000 回答
1

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

于 2013-03-23T17:00:05.060 回答