假设我有以下代码(删除了无用的东西,例如连接字符串,数据集创建,设置命令类型等)。
string sql = "SELECT * FROM SomeTable WHERE Field=@ParamValue";
using (SqlConnection conn = new SqlConnection())
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.Add(new SqlParameter("ParamValue", someValue));
da.Fill(ds);
}
这样使用参数化查询是否足以确保防止SQL注入的安全性,还是在将其作为参数传递之前是否需要先去除someValue
中的引号?
答案 0 :(得分:2)
否,您不需要转义引号。使用SQLParameters执行SQLCommand时,永远不会将参数直接插入到语句中。
相反,将调用名为sp_executesql的系统存储过程,并为其指定SQL字符串和参数数组(TDS协议)。
将参数隔离并将其视为数据。这样可以减轻对SQL注入的担心,并提供其他好处,例如强类型化和改进的性能。