假设我想删除一个名为变量值的表,例如“#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)基本上说你必须自己做检查,并且没有办法解决它(即通过解析或从中获取变量来确保变量有效值得信赖的来源),但我对这个答案并不满意。
答案 0 :(得分:3)
QUOTENAME
function将确保您的变量被视为"有效的SQL Server分隔标识符"。
由您来决定给定的表是否应该被允许删除。可能使用表上的SQL权限或可以删除的表的白名单......