Экранирование 'в строке Ruby, без экранирования \ для вставки в MySQL

У меня есть строка в Ruby вида: "Henry's string"

каждый gsub а также tr Я пытался дать мне такие формы, как "Henry\\'s string", "Henry\\\\'s string", так далее.

Все они избегают обратной косой черты, но оставляют меня без единой кавычки.

Я пробовал:

  • "Henry's string".gsub("'","\\\\'") с разным количеством \

  • "Henry's string".gsub(/'/) {|x| "\\\\#{x}"} снова с переменным количеством \

  • "Henry's string".gsub(/'/) {|x| "\\#{x}"}.gsub(/\\/) {|x| "#{x}"}

Я думаю, мне нужно нечетное количество \ чтобы полностью избежать ' (для загрузки в MySQL), но я не могу понять, как это получить.

1 ответ

При вставке в базу данных, например, MySQL, важно использовать подготовленные операторы со значениями-заполнителями. Я выделил это жирным шрифтом, потому что это очень важно понимать. Все, что для этого нужно, - это маленькая ошибка, и вы создали дыру в SQL-инъекции, которую может использовать каждый, и это может быть очень вредно.

Сбежать из строки может показаться поверхностно простым, но это не так. Есть много причудливых крайних случаев, которые вам нужно будет охватить, детали которых слишком сложны, чтобы упоминать их здесь в кратком ответе.

Простое решение состоит в том, чтобы вообще не беспокоиться о побеге, а писать запросы этой формы:

INSERT INTO table_name (column_name) VALUES (?)

Где ? представляет данные, которые вы вставляете. Вы можете использовать их, например, с mysql2 водитель, как это:

stmt = @client.prepare("INSERT INTO table_name (column_name) VALUES (?)")
stmt.execute("Henry's string")

Где этот драйвер позаботится о правильном кодировании значений, чтобы вам не пришлось об этом беспокоиться.

Вы также можете использовать что-то вроде Sequel или ActiveRecord, которые еще больше упростят ситуацию.

Другие вопросы по тегам