【问题标题】:Escape special characters in MySQL using C# and ASP.Net使用 C# 和 ASP.Net 转义 MySQL 中的特殊字符
【发布时间】:2011-07-18 11:42:26
【问题描述】:

我有一个带有 MySQL 后端的 ASP.Net 网页。此站点上的博客内容来自 MySQL 数据库。当我想写博客条目时,我会打开 MySQL Workbench,右键单击表格并选择“编辑数据”,然后继续输入我的条目。好吧,现在我正在开发一个 C# 应用程序,它允许我编写博客条目,这样我就不必每次都打开工作台。到目前为止,一切都很好,除了一个小问题:特殊字符。

==示例==

在textBox1中我会写如下,

我可以告诉你,由于撇号,这不起作用

我的代码看起来像这样(可能有点偏离,因为我是从内存中写出来的,但它确实有效):

MySQLCommand cmd = new MySQLCommand("",conn);
cmd.CommandText = "INSERT INTO blogEntry (entryText) VALUE (" + textBox1.text + ");";
...

这行得通,文本被插入到我的表格中。但是,当我将其拉出并将其绑定到 DataGridView 时,我看到了:

我可以告诉你,这赢了

就是这样(或者我看到一些奇怪的格式或其他东西)。

==SUMMARY==

我知道这与撇号没有被转义有关。所以我的问题是:

1) 在 C# 中,有没有办法遍历 textBox1 中的整个文本并将所有特殊字符 (') 替换为转义符 (\'),以便它们在从数据库中提取时正确显示?

2) 我读到一些人在 INSERT 语句中使用存储过程或参数。这对我有用吗?我该怎么做(我在寻找我的具体案例的例子时遇到了一些麻烦)?

感谢任何帮助、想法、链接等。

【问题讨论】:

    标签: c# asp.net mysql


    【解决方案1】:

    如果你使用的是Mysql客户端库,你可以使用这个函数

     MySql.Data.MySqlClient.MySqlHelper.EscapeString("YOUR DATA STRING")
    

    在你的情况下:

    MySQLCommand cmd = new MySQLCommand("",conn);
    cmd.CommandText = "INSERT INTO blogEntry (entryText) VALUE ('"+MySql.Data.MySqlClient.MySqlHelper.EscapeString(entryText)+"');";
    

    【讨论】:

    • 现在,我如何从 select 语句中取消转义从 MySQL 获得的数据?我看到数据已转义双引号并转义正斜杠...
    【解决方案2】:

    最好使用参数化查询。这样您就不需要转义字符,并且(更重要的是)有助于防止 SQL 注入攻击。

    cmd.CommandText = "INSERT INTO blogEntry (entryText) VALUES (@myvalue)"
    

    然后是类似的东西:

    cmd.Parameters.AddWithValue("@myvalue", TextBox1.Text);
    

    【讨论】:

      【解决方案3】:

      您至少应该使用参数化 SQL,否则您尝试清理输入可能会使您面临 SQL 注入。

      Check here.

      类似:

      cmd.CommandText = "INSERT INTO blogEntry (entryText) VALUE (?entryText)";
      cmd.Parameters.Add("?entryText", MySqlDbType.VarChar, 255, textBox1.text); 
      

      【讨论】:

        【解决方案4】:

        您可以使用正则表达式来替换特殊字符。 .Net 还提供 RegEx 类,该类具有 Escape 方法来替换特殊字符,该特殊字符转义最小字符集(\、*、+、?、|、{、[、(,)、^、$、.、# 和白色空格)通过用它们的转义码替换它们。

        MySQLCommand cmd = new MySQLCommand("",conn);
        cmd.CommandText = "INSERT INTO blogEntry (entryText) VALUE (" + Regex.Escape(textBox1.text) + ");";
        

        http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.escape.aspx

        【讨论】:

          【解决方案5】:

          这里有一个简单的方法来转义任何不需要的字符。假设大括号内的字符是您要避免的字符。

          char[] charsToTrim = { 'O','R', '`', ' ', '\'', '=', '1' , '-', ';'};  
          
          string value = " `admin` OR 1=1;-- ";
          
          lblescape.Text = value.Trim(charsToTrim);
          

          Trim(char[]) 将避免所有不需要的字符,但它有其自身的缺点,例如即使您希望使用字符“O”或“R”,您也不能使用它们,但我想您可以一些安排..

          【讨论】:

          • 如果我没看错,您将展示如何删除字符,而不是转义它们。 OP希望让“'”字符进入数据库而不是被切断。
          • 哦!我的坏家伙,我只是工作到很晚,我没有阅读所有的文字,我只是看了标题和其他随机回复,我不想误导任何人..
          【解决方案6】:

          在这种情况下,您绝对希望使用参数。它将避免转义问题并保护您免受 SQL 注入攻击(此代码目前易受攻击)。

          要使用参数,您的代码如下所示:

          MySQLCommand cmd = new MySQLCommand("",conn);
          cmd.CommandText = "INSERT INTO blogEntry (entryText) VALUE (?entryText);";
          

          然后,您将初始化参数。比如:

          cmd.Parameters.Add("?entryText", textBox1.Text);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-02-16
            • 2011-06-17
            • 2015-05-23
            • 2010-10-27
            相关资源
            最近更新 更多