2

我想用来MySqlParameter将 tableName 传递给查询(以防止 slq 注入)

MySqlCommand cmd = new MySqlCommand("select * from @table"), cn)
cmd.Parameters.AddWithValue("@table",TableName);

但这不起作用。如何将 tableName 作为参数传递

PS我试图改变@-?不工作

4

1 回答 1

5

您不能将表名作为参数传递。您必须使用动态 SQL 来执行此操作,因此您必须集中字符串来执行此操作,例如

  MySqlCommand cmd = new MySqlCommand(String.Format("select * from {0}",tableName), cn)

但是因为用户输入了tableName,所以SQL注入是可能的。您可以使用此 SQL 来确定该表是否存在,然后再从中查询任何内容:

SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'databasename'
AND table_name = 'tablename';

(您可以完美地对这个查询进行参数化,从而消除 SQL 注入)

通常,要小心 SQL 注入。但是如果你使用这个内部(不暴露给用户),那么 SQL 注入应该不是问题。

更好的是,您可以构造一个存储过程来处理这个问题,就像我的另一个答案一样:

使用 LINQ 的统一 SQL getter

于 2011-05-18T07:58:41.920 回答