c# - SQL 参数化与使用 string.format
问题描述
在防御 SQL 注入方面,对于更简单的查询,以下策略之一是否比另一个更有效?:
使用参数化:
using (SqlCommand command = new SqlCommand(@"SELECT * FROM @table", connection)) { command.Parameters.AddWithValue("@table", table_name); using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { ... } } }
使用
string.Format
:using (SqlCommand command = new SqlCommand(string.Format(@"SELECT * FROM {0}",table_name), connection)) using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { ... } }
解决方案
我在评论中稍微提到了这一点,但我也会在这里发布答案。
参数化(在我看来)始终是要走的路,因为它确保了查询的“安全性”(注入参数化查询更加困难/不可能),并且还允许重用查询计划,这也可以是大有裨益。
但是,对于您在这里所拥有的,您无法按预期对 SQL 进行参数化。变量不能替换对象的名称(db<>fiddle)。为此,您需要动态 SQL。
我不会假装我知道 C#,但是,对于你所拥有的,我不会,这意味着你有一个类似于“某事”的查询,例如:
using (SqlCommand command = new SqlCommand(@"DECLARE @SQL nvarchar(MAX) = N'SELECT * FROM ' + QUOTENAME(@table) + N';'; EXEC sp_executesql @SQL;", connection))
{
command.Parameters.AddWithValue("@table", table_name);
老实说,我不知道这是否在 C# 中以这种方式工作,但这将是您如何以(非常)简单的术语参数化动态对象。
推荐阅读
- python - 使用重复描述的单词使用 protobuf 元素的子属性
- c# - 在 2legged 上下文中使用 c# forge 包中的 x-user-id
- r - “for”循环内的 InputID
- reactjs - 如果 TextField 在材质 ui 中具有 Select 属性,则验证不起作用
- latex - 如何在新环境中包装 LaTex 命令
- ansible - vagrant ansible 访问其他机器IP地址
- java - 使用 JPA,方法需要 60 秒
- prolog - Prolog如何在不使用内置的情况下计算事实的数量
- javascript - 道具验证中缺少“孩子”
- python - CNN模型验证准确率没有提高