Экранирование 'в строке Ruby, без экранирования \ для вставки в MySQL - PullRequest
0 голосов
/ 23 мая 2018

У меня есть строка в 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}"}

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

1 Ответ

0 голосов
/ 24 мая 2018

При вставке в базу данных, например, 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 , которые еще больше упростят ситуацию.

...