Как избежать строки в Ruby для защиты от SQL Injection? (Нет рельсов)

Я просто хотел узнать, как мы можем избежать SQL-запроса (строки) в Ruby, чтобы предотвратить SQL Injection. обратите внимание, что я не использую структуру Rails.

Спасибо.

Ответы

Ответ 1

Если возможно, используйте модуль Ruby DBI, и вместо того, чтобы пытаться процитировать ваши строки, используйте параметризованные подготовленные запросы, например:

dbh = DBI.connect("DBI:Mysql:test:localhost", "testuser", "testpass")
sth = dbh.prepare("INSERT INTO people (id, name, height) VALUES(?, ?, ?)")
File.open("people.txt", "r") do |f|
  f.each_line do |line|
    name, height = line.chomp.split("\t")
    sth.execute(nil, name, height)
  end
end

Цитата будет правильно обработана для вас, и уколы будут ушли в прошлое.

Изменить: Обратите внимание, что в этом примере nil передается как первый параметр для выполнения(). Это соответствует первому? в запросе и переводится в "NULL" модулем DBI. Другие параметры аналогичным образом правильно цитируются и вставляются в запрос.

Ответ 2

Вам не нужно использовать рельсы, вы можете просто require 'activerecord' и использовать его так же, как в рельсах (определите модели и используйте их). То, что вы делаете, просто заново изобретает колесо.

Ответ 3

Напишите функцию wee для цитирования строк. Я думаю, что Rails просто использует что-то вроде этого:

def quote_string(v)
  v.to_s.gsub(/\\/, '\&\&').gsub(/'/, "''")
end

Ответ 4

Не пытайтесь дезинфицировать свои данные. Используйте подготовленные заявления. См. Также http://bobby-tables.com/ruby.html