相关疑难解决方法(0)

在.NET中的动态SQL中清理表/列名称?(防止SQL注入攻击)

我正在生成一些动态SQL,并希望确保我的代码是安全的SQL注入.

为了争论,这里是一个如何生成它的最小例子:

var sql = string.Format("INSERT INTO {0} ({1}) VALUES (@value)",
    tableName, columnName);
Run Code Online (Sandbox Code Playgroud)

在上面,tableNamecolumnName,以及@value来自不受信任来源的任何内容.由于占位符的使用@value是安全的SQL注入攻击,可以忽略.(该命令通过SqlCommand执行.)

但是,tableName并且columnName 不能作为占位符绑定,因此容易受到注入攻击.由于这是一个"真正动态"的场景,因此没有白名单tableNamecolumnName可用.

问题是:

是否有一个标准的,内置的方式来检查和/或消毒tableNamecolumnName?(SqlConnection,或帮助程序类等)如果没有,在使用第三方库的情况下执行此任务的好方法是什么?

笔记:

  • 所有SQL标识符,包括模式,都应该被接受:例如[schema].[My Table].column,就像"安全"一样table1.
  • 可以清理标识符或检测无效标识符.(它不需要确保表/列在上下文中实际有效;生成的SQL可能无效,但必须是"安全的".)

更新:

刚发现这个,并认为它有点有趣:.NET4中有一个SqlFunctions.QuoteName函数(EF4?).好的,这对我来说真的没有帮助......

.net sql sanitization sqlconnection dynamic-sql

11
推荐指数
2
解决办法
4929
查看次数

标签 统计

.net ×1

dynamic-sql ×1

sanitization ×1

sql ×1

sqlconnection ×1