我有一些关于如何借助参数化查询来防止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
查询执行?
谢谢
答案 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)
是的,参数化查询将正确地转义任何允许这种情况发生的字符。