我是一个动态生成SQL语句的程序员,希望确保我的代码免受SQL注入攻击。
为了举例说明,这里有一个最简单的生成方式:
在上述代码中,
然而,
因此,问题是:
是否有一种标准的内置方法来检查和/或净化
注意:
为了举例说明,这里有一个最简单的生成方式:
var sql = string.Format("INSERT INTO {0} ({1}) VALUES (@value)",
tableName, columnName);
在上述代码中,
tableName
,columnName
和绑定到@value
的任何内容都来自不受信任的来源。由于使用了占位符,@value
免受SQL注入攻击的影响,可以忽略它。(命令通过SqlCommand执行。)然而,
tableName
和columnName
不能作为占位符绑定,因此容易受到注入攻击。由于这是一个“真正动态”的场景,没有可用的tableName
或columnName
白名单。因此,问题是:
是否有一种标准的内置方法来检查和/或净化
tableName
和columnName
?(SqlConnection、助手类等)如果没有,有什么好的方法可以在不使用第三方库的情况下执行此任务?注意:
- 所有的SQL标识符,包括模式,都应该被接受:例如
[模式]。[我的表]。列
和table1
一样“安全”。 - 可以对标识符进行清理或检测无效标识符。(不需要确保表/列在上下文中实际上是有效的;生成的SQL可能无效,但必须是“安全”的。)
更新:
刚刚发现这个,觉得有些有趣:.NET4(EF4?)中有一个SqlFunctions.QuoteName函数。好吧,它并没有真正帮助我在这里……
DbProviderFactory
(例如,如果你正在使用SQL Server,你可以使用var factory = new SqlClient.SqlClientFactory()
),而不是第2行。 - Jeremy ToddDbCommandBuilder.QuoteIdentifier
能保护你免受嵌入分号的影响吗? - Mike