public static bool TruncateTable(string dbAlias,string tableName) { string sqlStatement = string.Format("TruncATE TABLE {0}",tableName); return ExecuteNonQuery(dbAlias,sqlStatement) > 0; }
解决方法
打击sql注入的最常见建议是使用SQL查询参数(这个线程上的几个人已经建议了).
在这种情况下这是错误的答案.您不能在DDL语句中为表名使用SQL查询参数.
SQL查询参数只能用于替换sql表达式中的文字值.这是sql的每个实现的标准.
当您有表名时,我的防止sql注入的建议是根据已知表名的列表验证输入字符串.
您可以从informatION_SCHEMA获取有效表名的列表:
SELECT table_name FROM informatION_SCHEMA.Tables WHERE table_type = 'BASE TABLE' AND table_name = @tableName
现在,您可以将输入变量作为sql参数传递给此查询.如果查询不返回任何行,则您知道该输入无效用作表.如果查询返回一行,则匹配,因此您可以更安全地使用它.
您还可以根据您定义的特定表的列表来验证表名称,以便您的应用程序截断,如@John Buchanan suggests.
即使在确认tableName作为RDBMS中的表名称后,我也建议分隔表名,以防万一使用带有空格或特殊字符的表名.在Microsoft sql Server中,默认标识符分隔符是方括号:
string sqlStatement = string.Format("TruncATE TABLE [{0}]",tableName);
原文地址:https://www.jb51.cc/csharp/95088.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。