创建“安全”的MySQL字符串(转义双引号)

时间:2012-12-20 17:51:51

标签: sql escaping double-quotes

我需要通过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);

}

1 个答案:

答案 0 :(得分:1)

连接器可能没有问题。发布的代码的输出将无法正确转义内容。

如果content = 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中。