C# 如何使用MySQL在C中保护用户指定的表名不受SQL注入的影响
作为对的一种反应,它似乎不支持以以下方式从用户输入中获取表名:C# 如何使用MySQL在C中保护用户指定的表名不受SQL注入的影响,c#,mysql,sql-injection,mysql-connector,C#,Mysql,Sql Injection,Mysql Connector,作为对的一种反应,它似乎不支持以以下方式从用户输入中获取表名: MySqlCommand cmd = new MySqlCommand("SELECT * FROM @table"); cmd.Parameters.AddWithValue("@table",TableNameFromUserInput); 所以我试图找到另一种方法,但我找不到任何能为我做到这一点的图书馆 在搜索如何手动执行此操作时,我找不到任何不告诉您使用已定义库中的准备语句的内容,无论是哪种语言 就我对SQL的有限知识而言
MySqlCommand cmd = new MySqlCommand("SELECT * FROM @table");
cmd.Parameters.AddWithValue("@table",TableNameFromUserInput);
所以我试图找到另一种方法,但我找不到任何能为我做到这一点的图书馆
在搜索如何手动执行此操作时,我找不到任何不告诉您使用已定义库中的准备语句的内容,无论是哪种语言
就我对SQL的有限知识而言,我只认为有必要在用户输入周围加上反勾号,然后检查输入是否有反勾号,但我想确定一下
问题
当MySQL连接器不支持用户指定的表名时,如何保护该表名不受SQL注入的影响?您不能在准备好的语句中添加tableName和columnName作为参数,因为它只支持值。为了您的安全,请添加其他代码来验证tableName,例如
string tableName = "hello";
tableName = UDFunctionClean(tableName);
string query = String.Format("SELECT * FROM `{0}`", tableName);
MySqlCommand cmd = new MySqlCommand(query);
不能将tableName和columnName作为参数添加到prepared语句中,因为它只支持值。为了您的安全,请添加其他代码来验证tableName,例如
string tableName = "hello";
tableName = UDFunctionClean(tableName);
string query = String.Format("SELECT * FROM `{0}`", tableName);
MySqlCommand cmd = new MySqlCommand(query);
检查是否
TableNameFromUserInput
是一个现有表,在执行查询之前。
这可以防止表等其他错误也不存在。检查
TableNameFromUserInput
是一个现有表,在执行查询之前。
这可以防止表等其他错误也不存在。UDFunctionClean应该做什么?转义反勾号,就这样?也许,实际上这取决于您,检查非法字符,例如单引号,因为tableName不能包含单引号。好吧,我不在乎他们是否尝试使用名为`的表;删除数据库dbName;选择*from`,我只想确保它不受非标准请求的影响。除了backtick,还有其他的SQL注入方法吗?我意识到我还需要转义,转义字符\。否则,用户只能转义第一个转义字符\`;在这里输入查询;SELECT*FROM`表格变成SELECT*FROM`\\`;在这里输入查询;从“表”中选择*。UDFunctionClean应该做什么?转义反勾号,就这样?也许,实际上这取决于您,检查非法字符,例如单引号,因为tableName不能包含单引号。好吧,我不在乎他们是否尝试使用名为`的表;删除数据库dbName;选择*from`,我只想确保它不受非标准请求的影响。除了backtick,还有其他的SQL注入方法吗?我意识到我还需要转义,转义字符\。否则,用户只能转义第一个转义字符\`;在这里输入查询;SELECT*FROM`表格变成SELECT*FROM`\\`;在这里输入查询;从“表”中选择*我喜欢这个主意,因为您可以为这个命令参数化表名。这似乎是一个可能的解决方案,但它需要为所有使用此查询的查询添加一个查询,在我的情况下,它将每秒执行10次或更长时间。@Aske您可以缓存现有表名的列表-它们通常不会快速更改…我喜欢这个想法,因为您可以为此命令参数化表名。这似乎是一个可能的解决方案,但对于使用此查询的所有查询,它需要额外的查询,在我的例子中,它将每秒执行10次或更长时间。@Aske您可以缓存现有表名的列表-它们通常不会快速更改。。。