安全地参数化SQL IN子句,应对可变参数
防止SQL注入漏洞,参数化包含IN子句的SQL查询至关重要。然而,当处理可变数量的参数时,这可能会变得复杂。以下是在SQL Server 2008中解决此问题的方法:
使用C#参数化每个参数,您可以采用以下方法:
<code class="language-csharp">string[] tags = new string[] { "ruby", "rails", "scruffy", "rubyonrails" }; string cmdText = "SELECT * FROM Tags WHERE Name IN ({0})"; string[] paramNames = tags.Select( (s, i) => "@tag" + i.ToString() ).ToArray(); string inClause = string.Join(", ", paramNames); using (SqlCommand cmd = new SqlCommand(string.Format(cmdText, inClause))) { for (int i = 0; i < tags.Length; i++) { cmd.Parameters.AddWithValue(paramNames[i], tags[i]); } // ... 执行查询 ... }</code>
这段代码创建了一个参数化的IN子句,包含指定数量的参数。结果是:
cmd.CommandText = "SELECT * FROM Tags WHERE Name IN (@tag0, @tag1, @tag2, @tag3)"
cmd.Parameters["@tag0"] = "ruby"
cmd.Parameters["@tag1"] = "rails"
cmd.Parameters["@tag2"] = "scruffy"
cmd.Parameters["@tag3"] = "rubyonrails"
重要的是要注意,此解决方案不会造成SQL注入风险,因为注入的文本并非基于用户输入,仅包含固定值。用户输入安全地存储在参数中。
虽然缓存查询计划可能很有益,但对于像这样的简单查询,它们并不总是能提供显着的优势。但是,从SQL Server 7版本开始,SQL Server会自动参数化查询,突显了参数化对于安全的重要性。
以上是如何使用可变数量的参数参数化SQL?的详细内容。更多信息请关注PHP中文网其他相关文章!