Создайте безопасную строку MySQL (избегайте двойных кавычек)

Мне нужно вставить текст в таблицу 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);

}

person Oumdaa    schedule 20.12.2012    source источник
comment
Используйте заполнители/параметры. Тогда с этими персонажами проблем не будет. Краткие примеры даны от Bobby Tables. Многие другие примеры приведены в соответствующей документации ADO/.NET. Также много повторяющихся вопросов.   -  person    schedule 20.12.2012
comment
Попробуйте stackoverflow.com/questions/6745393/   -  person sajanyamaha    schedule 20.12.2012
comment
Есть способы сделать то, что вам нужно, используя экранирование. Однако слушайте @pst и используйте параметризацию. Вы будете рады, что сделали в будущем ...   -  person PinnyM    schedule 20.12.2012
comment
Хотя многие люди думают, что SQL-инъекция предназначена только для злоумышленников, неиспользование правильной параметризации также может привести к тонким ошибкам и пограничным случаям (как вы уже обнаружили!), как это. Вот несколько сообщений SO, которые предлагают решения для написания надежного кода вставки (они также приводят к гораздо более красивому коду): stackoverflow.com/questions/681583/sql-injection-on-insert , stackoverflow.com/questions/13932068/ , stackoverflow.com/questions/7174792/   -  person    schedule 20.12.2012
comment
всем, кто хочет помочь; забудьте asp.net, C # и php и другие. Пожалуйста, предложите только решение MySQl   -  person Oumdaa    schedule 20.12.2012
comment
@pst не могли бы вы забыть, что существует программа C #! как вставить текст, содержащий такие символы, в таблицу mysql ??? DotNet env просто отправит строку в mysql, чтобы обработать ее нормально!   -  person Oumdaa    schedule 20.12.2012
comment
@pst Я знаю, как работать с Mysql, мне удалось вставить выборку и обновить таблицы в mysql, поэтому не присылайте мне учебники по Mysql.   -  person Oumdaa    schedule 20.12.2012
comment
@pst dbConnect — это объект DBConnect, который я создал сам для работы с методами подключения Mysql: OpenConnection() CloseConnection() ProcessQuery() ProcessNonQuery() и ProcessScalar()   -  person Oumdaa    schedule 20.12.2012
comment
@Oumdaa Тогда извини. Приложение не работает, потому что коннектор сломан. Я предлагаю использовать существующую инфраструктуру подключения или научиться проектировать надежный коннектор базы данных. Удачи.   -  person    schedule 20.12.2012
comment
давайте продолжим это обсуждение в чате   -  person Oumdaa    schedule 20.12.2012


Ответы (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#), поскольку проблема экранирования должна быть решена до перехода к уровням БД или API. Многие люди считают эту методологию плохой, поэтому они подталкивают вас к прямому использованию ЛЮБОГО стандартного соединителя MySQL, а не пытаются обернуть один из них в свой собственный API.

person Community    schedule 20.12.2012
comment
Спасибо. но я указал, что мне не нужно решение на основе php: только решение Mysql или трюк с C #! - person Oumdaa; 22.12.2012
comment
@Oumdaa Эта строка кода не работает должным образом: content = content.Replace("'", "\'");. Весь смысл этого ответа состоит в том, чтобы показать, что может решить эту проблему. Конечно, могут быть и другие проблемы в вашей настройке. "\'" эквивалентно "'". - person ; 02.01.2013