Как преобразовать строку, целое число, даты и т. Д. В запрашиваемый формат в ruby? - PullRequest
0 голосов
/ 25 октября 2019

Я пишу рубиновый камень. Одна из функций этого драгоценного камня состоит в том, чтобы выполнить запрос вставки в базу данных на основе data_rows, предоставленных пользователем. Мне нужно сделать запрос вставки, используя эти строки данных. Теперь эти строки данных могут содержать строку, целое число, даты и т. Д. Поэтому мне нужно преобразовать их в соответствующий формат запроса (например, "строка" в "\" строку \ "",). Мне нужно знать, есть ли какой-нибудь драгоценный камень, который может облегчить мою жизнь?

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

def formatted_value(val)
   (val.is_a? String) ? "\"#{val}\"" : val
end

Так что, если val равен "some text", он просто вернет "\"some text\"", и я могу продолжить и использовать его как

"Insert into table (str) VALUES (#{formatted_value(val)})"
=> "Insert into table (str) VALUES (\"some Text\")"

Который я могу отправить клиенту MySQL. Но у этого опять есть некоторые осложнения. Например, если пользователь отправляет значение val равным "some \"Text\"", я хочу преобразовать его в значение "\"some \\\"Text\\\" \"", чтобы запрос стал

"Insert into table (str) VALUES (\"some \\\"Text\\\" \") " 

перед отправкой его клиенту mysql. Одна вещь, которую я могуделаю здесь escape-строку, но опять же я не знаю, если она уже экранирована или нет.

Кроме того, это только для строки, мне нужно обрабатывать преобразование даты в строку тоже, как преобразование to_s не делаетсоответствовать формату. Вот почему я хочу знать, есть ли что-нибудь для этого уже доступное.

Ответы [ 2 ]

4 голосов
/ 25 октября 2019

Сиквел описывает себя как 'Database Toolkit for Ruby'. Его можно использовать для построения и выполнения запросов SQL для различных поставщиков баз данных. Он обрабатывает ценностное принуждение для вас. Например:

require 'sequel'

DB = Sequel.connect('jdbc:mysql://localhost/my_db')

DB[:table].insert(str: 'some Text')
# INSERT INTO "table" ("str") VALUES ('some Text') RETURNING "id"

DB[:table].insert(str: "some \"Text\"")
# INSERT INTO "table" ("str") VALUES ('some "Text"') RETURNING "id"

DB[:table].insert(str: 1)
# INSERT INTO "table" ("str") VALUES (1) RETURNING "id"

DB[:table].insert(str: Date.new(2000, 1, 1))
# INSERT INTO "table" ("str") VALUES ('2000-01-01') RETURNING "id"
0 голосов
/ 26 октября 2019

https://www.reddit.com/r/ruby/comments/a8flci/ruby_mysql2_gem_sql_injection/ Хороший источник, который упоминает два метода. Один из них использует Sequel gem, а другой - Mysql2, подготовьте гем, затем выполните.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...