0

作为对MySqlParameter as TableName的反应,MySQL 的 Connector/NET 库似乎不支持通过以下方式来自用户输入的表名:

MySqlCommand cmd = new MySqlCommand("SELECT * FROM @table");
cmd.Parameters.AddWithValue("@table",TableNameFromUserInput);

所以我试图找到另一种方法,但我找不到任何为我做这件事的库。

在搜索如何手动执行此操作时,无论语言如何,我都找不到任何没有告诉您使用某些已定义库中的“准备好的语句”的内容。

就我对 SQL 的有限了解而言,我只认为有必要在用户输入周围加上反引号 (`),然后检查输入是否有反引号 - 但我想确定一下。

问题

当 MySQL 连接器不支持时,如何保护用户指定的表名免受 SQL 注入?

4

2 回答 2

5

检查是否

TableNameFromUserInput

是一个现有的表,在执行查询之前。这也可以防止其他错误,例如“表不存在”。

于 2012-11-21T15:03:19.830 回答
1

您不能在准备好的语句中添加tableName以及 columnName)作为参数,因为它只支持一个值。为了您的安全,请添加其他代码来验证 tableName,例如。

string tableName = "hello";
tableName = UDFunctionClean(tableName);
string query = String.Format("SELECT * FROM `{0}`", tableName);
MySqlCommand cmd = new MySqlCommand(query);
于 2012-11-21T15:02:09.410 回答