如何使用MySQL在C#中保护用户指定的表名与SQL注入

时间:2012-11-21 14:58:25

标签: c# mysql sql-injection mysql-connector

作为对MySqlParameter as TableName的反应,MySQL's Connector/NET library似乎不支持用户输入的表名,方法如下:

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

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

当手动搜索如何执行此操作时,我找不到任何没有告诉您使用某些已定义库中的“预处理语句”的内容,无论语言是什么。

由于我对SQL的了解有限,我认为有必要在用户输入周围添加反引号(`),然后检查输入是否有反引号 - 但我想确定。

问题

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

2 个答案:

答案 0 :(得分:5)

检查是否

TableNameFromUserInput

是在执行查询之前的现有表。 这可以防止其他错误,例如"表格不存在"以及。

答案 1 :(得分:1)

您无法在预准备语句中添加tableName以及columnName )作为参数,因为它仅支持值。为了您的安全,请添加其他代码以验证tableName,例如

string tableName = "hello";
tableName = UDFunctionClean(tableName);
string query = String.Format("SELECT * FROM `{0}`", tableName);
MySqlCommand cmd = new MySqlCommand(query);