这似乎是一个愚蠢的问题,但我很惊讶我没有找到明确的答案:
是否可以使用SQL Server参数编写具有动态列名(和表名)的查询,或者输入是否需要非常仔细地进行清理?
情况是表及其列名(和列数)是动态生成的,并且无法事先知道手动编写查询。自从表格和列不知道我不能使用ORM,所以我采用手动查询。通常我会使用参数来填充值以防止SQL注入,但是我很确定在指定表名和/或列名时这不能以相同的方式完成。我想为insert,update,upsert和select创建通用查询,但我显然不希望自己打开潜在的注入。有关如何安全实现这一目标的最佳实践吗?
就像一个FYI - 我确实看到了this answer,但由于我无法预先知道列/表名,因此case语句可能不适用于这种情况。
环境:SQL Server 2014通过ADO.NET(.NET 4.5 / C#)
答案 0 :(得分:2)
没有将表或列引用传递给过程的机制。您只需将它们作为字符串传递,然后使用动态SQL来构建查询。您必须采取预防措施以确保您的字符串参数有效。
执行此操作的一种方法是在构建T-SQL查询之前验证所有表和列引用字符串在class X {
var x: Int
}
class Y: X {
override var x: Int {
get { ... }
set { ... }
}
}
和sys.tables
中是否具有有效名称。然后你可以确定它们可以安全使用。
使用sp_executesql
过程时,您还可以使用动态sql的文字参数。您无法使用它来验证表名和列名,但它会使用您的其他参数验证并阻止SQL注入。