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

0

У меня есть строка в Ruby формы: "Henry string"

Каждый gsub и tr который я пробовал, дают мне такие формы, как "Henry\\ string", "Henry\\\\ string" и т.д.

Все это ускользает от обратных косых черт, но оставляет меня с невыраженной одиночной цитатой.

Я пробовал:

  • "Henry string".gsub("'","\\\\'") с переменным числом \

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

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

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

  • 0
    Что вы хотите, чтобы ваша выходная строка была?
Теги:
gsub
escaping
single-quotes

1 ответ

6

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

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

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

INSERT INTO table_name (column_name) VALUES (?)

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

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

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

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

  • 1
    Но если вам нужно использовать строковые операции, по крайней мере, используйте @client.escape а не @client.escape делать это вручную с помощью String#gsub чтобы вы @client.escape это правильно.
  • 0
    @muistooshort Акцент на если и должен , но да, это!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню