我正在生成一些动态SQL,并希望确保我的代码是安全的SQL注入.
为了争论,这里是一个如何生成它的最小例子:
var sql = string.Format("INSERT INTO {0} ({1}) VALUES (@value)",
tableName, columnName);
Run Code Online (Sandbox Code Playgroud)
在上面,tableName和columnName,以及@value来自不受信任来源的任何内容.由于占位符的使用@value是安全的SQL注入攻击,可以忽略.(该命令通过SqlCommand执行.)
但是,tableName并且columnName 不能作为占位符绑定,因此容易受到注入攻击.由于这是一个"真正动态"的场景,因此没有白名单tableName或columnName可用.
问题是:
是否有一个标准的,内置的方式来检查和/或消毒tableName和columnName?(SqlConnection,或帮助程序类等)如果没有,在不使用第三方库的情况下执行此任务的好方法是什么?
笔记:
[schema].[My Table].column,就像"安全"一样table1.更新:
刚发现这个,并认为它有点有趣:.NET4中有一个SqlFunctions.QuoteName函数(EF4?).好的,这对我来说真的没有帮助......