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

Tsql 如何安全地删除具有变量名的表?,tsql,sql-injection,tablename,Tsql,Sql Injection,Tablename,假设我要删除一个表,其名称是一个变量值,例如“#t” 以上这些都不能避免SQL注入,那么还有什么替代方案呢 人们说“您必须使用动态SQL”,但这些示例通常仍然涉及不安全的连接,如上面的第三个示例 与我能找到的答案最接近的一点()基本上是说,你必须自己检查,没有办法解决(即,通过解析变量或从可信来源获取变量来确保变量有效),但我对这个答案不满意。将确保你的变量被视为“有效的SQL Server分隔标识符” 然后由您决定是否允许删除给定的表。可能对该表具有SQL权限,或者有一个可以删除的表白名单……

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

以上这些都不能避免SQL注入,那么还有什么替代方案呢

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

与我能找到的答案最接近的一点()基本上是说,你必须自己检查,没有办法解决(即,通过解析变量或从可信来源获取变量来确保变量有效),但我对这个答案不满意。

将确保你的变量被视为“有效的SQL Server分隔标识符”


然后由您决定是否允许删除给定的表。可能对该表具有SQL权限,或者有一个可以删除的表白名单……

因此基本上是:EXEC('drop table'+QUOTENAME(@tablename))我想知道在.NET anywhere中是否有一个等价的函数,我还想知道QUOTENAME是否对数据库中是否启用了use quoted identifier选项敏感,特别是当一个可选的引号被传递给它时它是如何工作的,例如“是的,代码应该是安全的”。背景:我构建了一个名为TempIDTable的C#类,其构造函数接受SqlConnection和整数ID列表。它生成一个具有给定名称的临时表(可选地包含一个行号列),并批量插入ID。您可以在C#中将整个内容包装在一个using块中,dispose方法处理删除表的操作。在using块中,您可以使用常规的SqlCommand select语句与id列上的临时表连接以选择所需的记录,并且在处理大型id列表时,其速度比任何其他方法都快。该类使用了常量“#s”作为名称,但我想将表名设为变量,为了确保drop语句不会由于程序员错误或其他原因而出现错误,我想强制执行一条规则,即表名必须是有效的/带引号的表名,另外它必须是以“#”开头的临时表。仅供参考。。。临时表在连接关闭时自动删除。见本页“临时表格”一段:
SqlCommand cmd = new SqlCommand( "drop table " + TableName ); //Not safe
SqlCommand cmd = new SqlCommand( "drop table [" + TableName +"]" ); //Not safe
EXEC( 'drop table [' + @tablename +"]" ); --Not safe