MySQL参数化查询的功能与在C#应用程序中未参数化一样

MySQL parameterized query is functioning like it is not parameterized in C# application

提问人: 提问时间:12/20/2021 更新时间:2/3/2022 访问量:282

问:

我一直收到此错误:MySql.Data.MySqlClient.MySqlException:'您的SQL语法中有错误;查看与您的 MySQL 服务器版本相对应的手册,了解在“功能:SecurityTesting @mytag 场景:SQL 注入”附近使用的正确语法 鉴于我访问“在第 1 行”

参数 Gherkin 是导致查询失败的参数。我都试过了?和 @ 作为参数前缀,没有任何变化。

这是我的代码:

string CommandText = " INSERT INTO Feature(`Path`, Gherkin, RepoID, `Name`, Updated) VALUES (?Path,  ?Gherkin , ?RepoID, ?Name, ?Updated) ON DUPLICATE KEY UPDATE Gherkin = VALUES(?Gherkin); ";


       

            using (MySqlConnection connection = new MySqlConnection())
            {
                connection.ConnectionString = ConfigurationManager.ConnectionStrings["TAF_DB"].ConnectionString;
                using (MySqlCommand command = new MySqlCommand())
                {

                    var gherkinParam = new MySqlParameter("Gherkin", test.Gherkin);
                    //var gherkinParam = new MySqlParameter("Gherkin", MySqlDbType.VarChar);
                    var pathParam = new MySqlParameter("Path", MySqlDbType.VarChar);
                    var RepoIDParam = new MySqlParameter("RepoID", MySqlDbType.Int64);
                    var nameParam = new MySqlParameter("Name", MySqlDbType.VarChar);
                    var updatedParam = new MySqlParameter("Updated", MySqlDbType.VarChar);

                    gherkinParam.Value = test.Gherkin;
                    command.Parameters.Add(gherkinParam);
                    pathParam.Value = test.Path;
                    command.Parameters.Add(pathParam);
                    RepoIDParam.Value = test.RepoID;

                    command.Parameters.Add(RepoIDParam);
                    nameParam.Value = test.Name;

                    command.Parameters.Add(nameParam);
                    updatedParam.Value = test.Updated;
                    command.Parameters.Add(updatedParam);

                    command.Connection = connection;
                    command.CommandType = CommandType.Text;
                    command.CommandText = CommandText;
                    connection.Open();
                    command.ExecuteNonQuery();
                    connection.Close();

                }
            }
C# mysql .net 准备语句 sql 注入

评论

0赞 Charlieface 12/21/2021
一些侧面提示:不是必需的,这是默认设置。 也没有必要,会这样做。您可以使用 construcotr 参数缩短到 您也可以将参数缩短到 etc。您可以将多行字符串用于命令文本command.CommandType = CommandType.Text;connection.Close();usingusing (var connection = new MySqlConnection(ConfigurationManager.ConnectionStrings["TAF_DB"].ConnectionString)) using (var command = new MySqlCommand(CommandText, connection)) {...command.Parameters.Add(new MySqlParameter("@Gherkin", MySqlDbType.VarChar).Value = test.Gherkin;@"

答:

2赞 forpas 12/20/2021 #1

您应该使用函数 VALUES() 中的列名,而不是命名参数:Gherkin?Gherkin

UPDATE Gherkin = VALUES(Gherkin)

评论

0赞 12/22/2021
谢谢!这在语句的最后一部分起到了作用,但我仍然必须有一个 @ 或 ?第一个“VALUES”部分的前缀,否则该值始终是“Gherkin”。
0赞 forpas 12/22/2021
@Benny当然要用?VALUES 列表中的小黄瓜。我的答案是关于 UPDATE 语句中的 VALUES() 函数。