【发布时间】: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);
}
【问题讨论】:
-
使用占位符/参数。那么“那些字符”就没有问题了。简要示例在by Bobby Tables 中给出。相应的 ADO/.NET 文档提供了更多示例。还有很多重复的“问题”。
-
有一些方法可以使用转义来做你需要的事情。但是,请听 @pst 并使用参数化。你会很高兴你在路上做了......
-
虽然许多人认为 SQL 注入“只”适用于攻击者,但不使用适当的参数化也会导致微妙的错误和极端情况(如您所见!),就像这样。以下是一些 SO 帖子,它们提供了编写健壮插入代码的解决方案(它们也导致 更漂亮的代码):stackoverflow.com/questions/681583/sql-injection-on-insert、stackoverflow.com/questions/13932068/…、stackoverflow.com/questions/7174792/…
标签: sql escaping double-quotes