1

假设我要删除一个表,其名称是一个变量值,例如“#t”。

SqlCommand cmd = new SqlCommand( "drop table " + TableName ); //Not safe
SqlCommand cmd = new SqlCommand( "drop table [" + TableName +"]" ); //Not safe
EXEC( 'drop table [' + @tablename +"]" ); --Not safe

以上都不是安全的 SQL 注入,那么有什么替代方法呢?

人们说“你必须使用动态 SQL”,但这些示例仍然通常涉及不安全的连接,就像上面的第三个示例一样。

我能找到的最接近答案的东西(https://stackoverflow.com/a/14026855/88409)基本上说你必须自己做检查,而且没有办法解决它(即通过解析它确保变量是有效的或从可信赖的来源获取),但我对这个答案不满意。

4

1 回答 1

3

QUOTENAME函数将确保您的变量被视为“有效的 SQL Server 分隔标识符”。

然后由您决定给定的表是否是他们应该允许删除的表。也许对表具有 SQL 权限或可以删除​​的表的白名单...

于 2013-10-22T21:03:46.107 回答