【问题标题】:SQL Server : parameters for column names instead of valuesSQL Server:列名而不是值的参数
【发布时间】:2015-08-17 16:20:13
【问题描述】:

这似乎是一个愚蠢的问题,但我很惊讶我还没有找到明确的答案:

是否可以使用 SQL Server 参数来编写具有动态列名(和表名)的查询,还是只需要非常仔细地清理输入?

情况是表及其列名(和列数)是动态生成的,无法事先知道手动编写查询。由于不知道表和列,我不能使用 ORM,所以我求助于手动查询。通常我会使用参数来填充值以防止 SQL 注入,但是我很确定在指定表名和/或列名时不能以相同的方式完成。我想为插入、更新、更新插入和选择创建通用查询,但我显然不想让自己接受潜在的注入。是否有关于如何安全完成此任务的最佳实践?

仅供参考 - 我确实看到了 this answer,但由于我无法事先知道列/表名称,因此 case 语句可能不适用于这种情况。

环境:SQL Server 2014 通过 ADO.NET (.NET 4.5 / C#)

【问题讨论】:

  • 好吧,如果您进行动态查询,您不需要知道列/表名称。但是,如果传递不同的表,则需要知道它们之间的关系。如果是这种情况,您还必须在参数中传递关系。

标签: sql-server tsql ado.net parameterized-query


【解决方案1】:

没有将表或列引用传递给过程的机制。您只需将它们作为字符串传递,然后使用动态 SQL 来构建您的查询。您必须采取预防措施以确保您的字符串参数有效。

执行此操作的一种方法是在构建 T-SQL 查询之前验证所有表和列引用字符串在 sys.tablessys.columns 中的名称是否有效。这样您就可以确定它们可以安全使用。

在使用sp_executesql 过程时,您还可以将文字参数与动态sql 一起使用。您不能使用它来验证您的表名和列名,但它可以使用您的其他参数验证并防止 SQL 注入。

【讨论】:

  • 我已经阅读了一些关于使用 sp_executesql 的文章,但从未使用过它。不过,我真的很喜欢使用数据库中的元数据进行验证的想法。
猜你喜欢
  • 2023-03-28
  • 2014-05-15
  • 1970-01-01
  • 1970-01-01
  • 2017-08-22
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多