SQL注入的问题在C#查询

问题描述:

我已经写在我的C#code.Table名称一些SQL查询使用enum.Then把它分配给一个全局变量和追加到字符串被传递给构造,SQL注入的问题在C#查询

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注入情形中,从一个code.Need recfatoring上述const.I试图与添加标签(@tablename)和tried.But它没有成功。

const string ADD_SQL = "INSERT INTO @tablename (Data) VALUES (@valueOne)"; 
var commandText = ADD_MESSAGE_SQL.Replace("@tablename", _tableName); 

任何其他可能的解决方案,以避免这种情况?

+1

@DragandDrop为什么你建议重复关于参数,当你可能知道表名不能被参数化? –

+0

您应该总是使用参数化查询,在参数化查询上进行搜索以获取更多详细信息 – jimmi94

+4

[SqlParameter不允许使用表名称 - 其他选项无sql注入攻击?](https://*.com/questions/17947736/sqlparameter-不会允许表的名称,其他选项没有SQL注入在) – tia

Veracode很可能不喜欢你将SQL查询当成你当前的语句,而是想用它的指定方式编写这段代码。如在documentation in the Repair section中可见的那样,它希望您使用准备语句来创建参数化查询。

现在您可以选择。我认为这是存储过程会更好,但如果你必须保持query in C#,只是不要试图使一个查询过于通用的所有场景和表。

如果您的字符串来自用户输入,那么将字符串并入SQL语句是有风险的。
虽然这不是你所描述的情况,但我猜测Veracode工具并不知道字符串来自哪里,它只是看到字符串连接并发出警告。 (通常我更喜欢使用存储过程,但这是另一个主题[您可以搜索存储过程vs内联SQL])并使用参数值(Identifiers can'在SQL中参数化,正如你已经发现的那样)。

所以不是

const string ADD_SQL = "INSERT INTO {0} (ColumnOne) VALUES (@valueOne)"; 
const string CLEAR_SQL = "DELETE FROM {0}"; 

,并在运行时添加的表名,这里是一个更好的解决方案:

const string ADD_tableName = "INSERT INTO TableName (ColumnOne) VALUES(@ValueOne)" 
const string CLEAR_tableName = "DELETE FROM TableName"; 

甚至有更好的解决方案在那里,但是这是最简单的解决为你提供的代码。