作为对MySqlParameter as TableName的反应,MySQL's Connector/NET library似乎不支持用户输入的表名,方法如下:
MySqlCommand cmd = new MySqlCommand("SELECT * FROM @table");
cmd.Parameters.AddWithValue("@table",TableNameFromUserInput);
所以我试图找到另一种方法,但我找不到任何为我这样做的库。
当手动搜索如何执行此操作时,我找不到任何没有告诉您使用某些已定义库中的“预处理语句”的内容,无论语言是什么。
由于我对SQL的了解有限,我认为有必要在用户输入周围添加反引号(`),然后检查输入是否有反引号 - 但我想确定。
当MySQL Connector不支持时,如何保护用户指定的表名不受SQL注入?
答案 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);