【发布时间】:2018-03-29 22:51:09
【问题描述】:
我有一些用我的 C# 代码编写的 SQL 查询。表名称使用枚举传递给构造函数。然后它分配给全局变量并附加到字符串,
const string ADD_SQL = "INSERT INTO {0} (ColumnOne) VALUES (@valueOne)";
const string CLEAR_SQL = "DELETE FROM {0}";
var commandText = string.Format(ADD_SQL , _tableName);
但是当我运行 Veracode 工具时,它显示该查询在执行时可能存在 SQL 注入。
command.ExecuteNonQuery();
从代码中避免这种 SQL 注入场景的任何可能的解决方案。需要对上述 const 进行重构。我尝试添加标签 (@tablename) 并尝试过。但没有成功。
const string ADD_SQL = "INSERT INTO @tablename (Data) VALUES (@valueOne)";
var commandText = ADD_MESSAGE_SQL.Replace("@tablename", _tableName);
还有其他可能的解决方案来避免这种情况吗?
【问题讨论】:
-
@DragandDrop 为什么在您可能知道表名无法参数化时建议重复参数?
-
您应该始终使用参数化查询,搜索参数化查询以获得更多详细信息
-
@jimmi94 显示示例比建议无法完成的事情要有用得多...stackoverflow.com/questions/3128582/… 可能是您可以为表名做的最好的事情,如果您必须插入它们。 .
-
@LahiruD,
SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE table_name=@Param现在你很确定没有 sql 注入。来自@Tia dupe target 的评论。
标签: c# sql-injection veracode