c# – 如何保护此功能免于SQL注入?
发布时间:2020-12-15 06:39:04 所属栏目:百科 来源:网络整理
导读:public static bool TruncateTable(string dbAlias,string tableName){ string sqlStatement = string.Format("TRUNCATE TABLE {0}",tableName); return ExecuteNonQuery(dbAlias,sqlStatement) 0;} 解决方法 打击SQL注入的最常见建议是使用SQL查询参数(这个
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); 现在,如果tableName匹配一个真实的表,那么SQL注入的风险就是这样,而你实际上在表的名称中使用方括号! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |