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 有条件地将列设置为其默认值?
asp.net中 使用参数化mysqlparameter 保存数据时,总保存成一个汉字的解决方案。