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 注入问题并提供了其他好处,例如强类型和改进的性能。
假设我有以下代码(删除无用的东西,如连接字符串、数据集创建、设置命令类型等)。
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 注入问题并提供了其他好处,例如强类型和改进的性能。