C# 必须将收到的无参数查询转换为自动参数化查询。如果在客户机中正确参数化查询,则可以避免每次尝试。如果每秒有大量的失败的自动参数甚至更糟糕,这意味着查询将进入优化和执行计划生成的整个周期。现在,这是一个正确的答案+1大多数答案都使用注入参数,但我不接受这一点,
C# 必须将收到的无参数查询转换为自动参数化查询。如果在客户机中正确参数化查询,则可以避免每次尝试。如果每秒有大量的失败的自动参数甚至更糟糕,这意味着查询将进入优化和执行计划生成的整个周期。现在,这是一个正确的答案+1大多数答案都使用注入参数,但我不接受这一点,,c#,sql-server,security,sql-injection,C#,Sql Server,Security,Sql Injection,必须将收到的无参数查询转换为自动参数化查询。如果在客户机中正确参数化查询,则可以避免每次尝试。如果每秒有大量的失败的自动参数甚至更糟糕,这意味着查询将进入优化和执行计划生成的整个周期。现在,这是一个正确的答案+1大多数答案都使用注入参数,但我不接受这一点,除非有人能向我展示一个有效的基于整数的注入!您的回答Remus,很可能会让我在任何情况下都使用参数(即使我们的数据库每秒看不到数千个请求),谢谢 int key = some_number_derived_from_a_dropdown_or_
必须将收到的无参数查询转换为自动参数化查询。如果在客户机中正确参数化查询,则可以避免每次尝试。如果每秒有大量的
失败的自动参数
甚至更糟糕,这意味着查询将进入优化和执行计划生成的整个周期。现在,这是一个正确的答案+1大多数答案都使用注入参数,但我不接受这一点,除非有人能向我展示一个有效的基于整数的注入!您的回答Remus,很可能会让我在任何情况下都使用参数(即使我们的数据库每秒看不到数千个请求),谢谢
int key = some_number_derived_from_a_dropdown_or_whatever
SqlCommand cmd = new SqlCommand("select * from table where primary_key = " + key.ToString());
SqlCommand cmd = new SqlCommand("select * from table where primary_key = @pk");
SqlParameter param = new SqlParameter();
param.ParameterName = "@pk";
param.Value = some_number_derived_from_a_dropdown_or_whatever;
cmd.Parameters.Add(param);
-- Not vulnerable to injection as long as you trust int and int.ToString()
int key = some_number_derived_from_a_dropdown_or_whatever ;
SqlCommand cmd = new SqlCommand("EXEC sp_to_retrieve_row " + key.ToString());
-- Vulnerable to injection all of a sudden
string key = some_number_derived_from_a_dropdown_or_whatever ;
SqlCommand cmd = new SqlCommand("EXEC sp_to_retrieve_row " + key.ToString());