【问题标题】:Create MySQL string that is "safe" (escape double quotes)创建“安全”的 MySQL 字符串(转义双引号)
【发布时间】:2012-12-20 17:51:50
【问题描述】:

我需要通过 C# 将文本插入到 MySQL 表中。 dbConnect 是我自己创建的适配器,ProcessNonQuery 只接受一个字符串。

我无法插入包含 "' 字符的文本。

这是我的尝试:

public void InsertArticle(string name, string title, string keywords, string desc, string content, int idCategory,bool featured)// int level, int typeArt
{                        
    this.dbConnect.ProcessNonQuery(" set global sql_mode=\"NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION\"");
    string strFeatured;

    if (featured)
        strFeatured = "1";
    else
        strFeatured = "0";
    content = content.Replace("'", "\'");
    StringBuilder sbInsertArticle = new StringBuilder("INSERT INTO Article(NameArt, TitleArt, keywordsArt, DescArt, ContentArt, idCategory, idLevel, idTypeArt, Featured) VALUES('");
    sbInsertArticle.Append(name); sbInsertArticle.Append("', '");
    sbInsertArticle.Append(title); sbInsertArticle.Append("', '");
    sbInsertArticle.Append(keywords); sbInsertArticle.Append("', '");
    sbInsertArticle.Append(desc); sbInsertArticle.Append("', '");
    sbInsertArticle.Append(content); sbInsertArticle.Append("', '");
    sbInsertArticle.Append(idCategory.ToString()); sbInsertArticle.Append("', '");
    sbInsertArticle.Append(1); sbInsertArticle.Append("', '");
    sbInsertArticle.Append(1); sbInsertArticle.Append("', '");
    sbInsertArticle.Append(strFeatured); sbInsertArticle.Append("')");

    string strInsertArticle = sbInsertArticle.ToString();
    this.dbConnect.ProcessNonQuery(strInsertArticle);

}

【问题讨论】:

标签: sql escaping double-quotes


【解决方案1】:

连接器可能没有问题。已发布代码的输出不会正确转义内容。

如果内容 = it's don"t working 则输出类似于:

INSERT INTO Article(NameArt, TitleArt, keywordsArt,
  DescArt, ContentArt, idCategory, idLevel, idTypeArt, Featured)
  VALUES('foo', 'bar', 'mysql escaping', 'hmph',
    'it's don"t working', '12', '1', '1', '1');

在任何连接器中都应该失败。

content = content.Replace("'", "\\'");

将是一个开始,但您至少应该使用mysql_real_escape_string() 之类的东西。

编辑:进一步解释

在测试程序中运行以下行:

Console.WriteLine("'");
Console.WriteLine("\'");
Console.WriteLine("\\'");

前两个将输出'。最后一个将输出\'

最后,由于您选择提供给调用者的接口,这个问题在 MySQL 中无法解决,也无法在您的连接器中解决。 void ProcessNonQuery(string strParam) 过于简单,无法允许将“转义”工作推入 API 所必需的参数化查询。

因此,您使用此“连接器”获得的任何解决方案都将特定于您从 (C#) 调用它的语言,因为在进入 DB 或 API 层之前必须解决转义问题。许多人认为这种方法很糟糕,这就是为什么他们推动您直接使用任何标准 MySQL 连接器,而不是尝试将其中一个包装在您自己的 API 中。

【讨论】:

  • 谢谢。但我已经指定我不需要基于 php 的解决方案:只有 Mysql 解决方案或 c# 技巧!
  • @Oumdaa 这行代码没有按预期工作:content = content.Replace("'", "\'");。这个答案的重点是展示什么可以解决这个问题。您的设置中肯定可能存在其他问题。 "\'" 等价于 "'"
猜你喜欢
  • 1970-01-01
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多