MySqlParameter 作为 TableName

Posted

技术标签:

【中文标题】MySqlParameter 作为 TableName【英文标题】:MySqlParameter as TableName 【发布时间】:2011-08-27 20:13:57 【问题描述】:

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

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

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

附:我试图将 @ 更改为 ? - 不工作

【问题讨论】:

【参考方案1】:

您不能将表名作为参数传递。 您必须使用动态 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 注入应该没有问题。

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

Unified SQL getter with LINQ

【讨论】:

-1。这是使用纯字符串的不好方法,因为我可以通过 tableName = "users ; DROP TABLE users;" ,这将删除表 用户将输入表名。我不喜欢使用存储过程,在客户端需要一些解决方案 感谢您的帮助。我将正则表达式验证放在客户端输入上 为什么不使用用户可以选择的所有可用/合格表填充下拉列表,从而消除整个注入。

以上是关于MySqlParameter 作为 TableName的主要内容,如果未能解决你的问题,请参考以下文章

MySqlParameter

如何使用 MySqlParameter 有条件地将列设置为其默认值?

asp.net中 使用参数化mysqlparameter 保存数据时,总保存成一个汉字的解决方案。

将 List<int> 添加到 mysql 参数

使用 ID 而不是对象填充 SQLAlchemy 多对多关系

AX_SysTableBrowser