SQL 服务器参数化 SQL 查询 - 我还需要转义引号吗?

SQL Server parameterized SQL query - do I still need to escape quotes?

假设我有以下代码(删除无用的东西,如连接字符串、数据集创建、设置命令类型等)。

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 中删除引号,然后再将其作为参数传递?

不,您不需要转义引号。当您使用 SQL 参数执行 SQL 命令时,参数永远不会直接插入到语句中。

相反,调用了一个名为 sp_executesql 的系统存储过程,并给出了 SQL 字符串和参数数组(TDS 协议)。

参数被隔离并被视为数据。这减轻了 SQL 注入问题并提供了其他好处,例如强类型和改进的性能。