如何安全地删除具有变量名称的表?

时间:2013-10-22 20:52:30

标签: tsql sql-injection tablename

假设我想删除一个名为变量值的表,例如“#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)基本上说你必须自己做检查,并且没有办法解决它(即通过解析或从中获取变量来确保变量有效值得信赖的来源),但我对这个答案并不满意。

1 个答案:

答案 0 :(得分:3)

QUOTENAME function将确保您的变量被视为"有效的SQL Server分隔标识符"。

由您来决定给定的表是否应该被允许删除。可能使用表上的SQL权限或可以删除​​的表的白名单......