这个动态创建的 sql 有多脆弱?

How vulnerable is the this dynamically created sql?

我可以在网上找到很多关于动态创建参数化查询的正确和安全方法的信息。然而,此类网站仅谈论where子句的参数化。

那么,sql 语句的其他子句呢?请参阅以下内容:

       string sql = string.Format(@"                
            SELECT MIN(TableName) as TableName, {0}
            FROM
            (
              SELECT 'Table A' as TableName, {0}
              FROM {1}
              UNION ALL
              SELECT 'Table B' as TableName, {0}
              FROM {2}
            ) tmp
            GROUP BY {0}
            HAVING COUNT(*) = 1", columnList, tableA, tableB);

我正在构建一个声明,其中参数化了以下内容:

  1. select 子句中的项目
  2. from 子句中的表名

问题: 这对 sql 可能造成一些损害的注入有多脆弱?

无论如何,我想不出恶意黑客可以注入 sql,从而生成格式正确的可执行文件 sql。但话又说回来,我不是 sql 专家。

这实际上取决于 columnListtableAtableB 的来源。如果它们来自您的代码,没有用户输入,那么它是非常安全的。如果用户指定了table个名字,你就得准备好迎接Little Bobby Tables.

在我公司的主要 c# 应用程序中,我们使用类似的东西来声明列,但是 SQL table 中的列是在 class 中定义的 table,因此我们可以构建 select,从 class 添加、更新和创建 table 个字符串。用户永远无法定义这些列。

正如@Andrew 在他的回答中指出的那样,如果参数不受任何用户输入的影响,或者以其他方式获得 validated/cleaned 应该没问题。

为了回答您关于可能的 SQL 语句格式正确的观点...引起关注的唯一领域是潜在的转义字符(例如 semi-colon,技术上可以将其放置在命令方块)and/or 语句的 {1}{2} 部分的内容 well-formed。