Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用MySQL在C中保护用户指定的表名不受SQL注入的影响_C#_Mysql_Sql Injection_Mysql Connector - Fatal编程技术网

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您可以缓存现有表名的列表-它们通常不会快速更改。。。