如何通过 MySql 传递带有撇号的 C# 变量

Posted

技术标签:

【中文标题】如何通过 MySql 传递带有撇号的 C# 变量【英文标题】:How to pass a C# variable with apostrophe through MySql 【发布时间】:2014-10-21 21:03:15 【问题描述】:

我在将变量输入数据库时​​遇到问题。我已经看过其他关于如何通过转义变量来传递变量的帖子,但是这些解决方案并不适用,因为我是通过 API 获取变量的。顺便说一句,我正在使用 foreach 循环遍历数据。

level = "" + x.Account_Level + "";
name = "" + x.name + "";
command.CommandText = "INSERT INTO `data` (`level`, `name`) VALUES(" + level + ", " + name + ")";
command.ExecuteNonQuery();  

有时,一个变量会带有一个撇号,并会搞砸代码。是否可以在每个撇号之前插入一个斜杠,或者有没有像 php 那样用单引号推动整个变量的方法?谢谢!

编辑: 这行得通吗?我想我需要添加 i 来更改每个循环的参数名称,因为它声称参数已经声明。

using (var web = new WebClient())
        
        web.Encoding = System.Text.Encoding.UTF8;
        var jsonString = responseFromServer;
        var jss = new javascriptSerializer();
        var MatchesList = jss.Deserialize<List<Matches>>(jsonString);
        string connectString = "Server=myServer;Database=myDB;Uid=myUser;Pwd=myPass;";
        mysqlConnection connect = new MySqlConnection(connectString);
        MySqlCommand command = connect.CreateCommand();
        int i = 1;


        connect.Open();
        foreach (Matches x in MatchesList)
        

            command.CommandText = "INSERT INTO `data` (`level`, `name`) VALUES(?level" + i + ", ?name" + i + ")";

             command.Parameters.AddWithValue("level" + i, x.Account_Level);
             command.Parameters.AddWithValue("mode" + i, x.name);

            command.ExecuteNonQuery();
            i++;
        
        connect.Close();                    
    

【问题讨论】:

你真的应该使用 SQL 参数,你的代码很容易受到 SQL 注入攻击。作为一个很好的副作用,你也可以通过这种方式摆脱你的问题。 看 ip "c# mysql 参数" 【参考方案1】:

快速而肮脏的解决方法是使用类似的东西:

level = level.Replace("'","whatever");

但仍然存在问题。它不会捕捉到其他坏字符,甚至可能不适用于撇号上的边缘情况。

最好的解决方案是不要以这种方式构造查询。相反,学习如何使用参数化查询,这样 SQL 注入攻击就不会发生,而且无论您在其中输入什么参数(当然是在合理范围内),参数都可以正常工作。

例如(在我的脑海中,所以可能需要一些调试):

MySqlCommand cmd = new MySqlCommand(
    "insert into data (level, name) values (?lvl, ?nm)", con);
cmd.Parameters.Add(new MySqlParameter("lvl", level));
cmd.Parameters.Add(new MySqlParameter("nm", name)); 
cmd.ExecuteNonQuery();

【讨论】:

我之前尝试过制作参数,但它只是在 foreach 循环中搞砸了。它只是返回我之前已经声明过类似'@level'的东西。是否可以在参数名称中的 var i 中使用计数并在每个循环中使用 i++? @Kragalon,是的,你可以这样做。我自己不会:-) 是安全问题还是效率低下? 这似乎是我唯一的选择。由于我需要设置参数,而之前它会出现故障。 @Kragalon,按照您的方式构建查询是一个安全问题,因为它会使您面临 SQL 注入攻击。有一些方法可以让您的 DBMS 执行任意指令。参数化查询解决了这个问题。

以上是关于如何通过 MySql 传递带有撇号的 C# 变量的主要内容,如果未能解决你的问题,请参考以下文章

如何将包含撇号的字符串传递给android中的查询?

SQL Server 到 Mysql 的迁移(使用 Mysql Workbench)。如何在 Workbench 向导的步骤中添加带有手动转义撇号的数据?

通过 PhpMyAdmin 将带撇号的 SQL 数据库导入 MySQL

在 PHP 中,如何创建包含引号和撇号的 mySQL 选择查询?

在 Apps 脚本中对带有撇号的位置进行地理编码会出现“不允许操作”错误

如何在Elasticsearch上搜索带或不带撇号的单词?并处理拼写错误?