MySqlParameter作为TableName

Ste*_*cya 2 c# mysql mysql-connector mysql-parameter

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

MySqlCommand cmd = new MySqlCommand("select * from @table"), cn)
cmd.Parameters.AddWithValue("@table",TableName);
Run Code Online (Sandbox Code Playgroud)

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

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

Vim*_*987 5

您不能将表名作为参数传递.您必须使用动态SQL来执行此操作,因此您必须使用字符串浓度来执行此操作

  MySqlCommand cmd = new MySqlCommand(String.Format("select * from {0}",tableName), cn)
Run Code Online (Sandbox Code Playgroud)

但是因为用户输入了tableName,所以SQL注入是可能的.您可以使用此SQL在查询该表之前确定该表是否存在:

SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'databasename'
AND table_name = 'tablename';
Run Code Online (Sandbox Code Playgroud)

(您可以完美地参数化此查询,因此将消除SQL注入)

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

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

使用LINQ的Unified SQL getter

  • -1.这是使用纯字符串的坏方法,因为我可以传递`tableName ="users; DROP TABLE users;"`,这将删除表 (2认同)