Я просто хотел знать, как мы можем избежать SQL-запроса (строки) в Ruby, чтобы предотвратить SQL Injection. обратите внимание, что я не использую Rails framework.Как избежать строки в Ruby для защиты от SQL Injection? (No Rails)
Спасибо.
Я просто хотел знать, как мы можем избежать SQL-запроса (строки) в Ruby, чтобы предотвратить SQL Injection. обратите внимание, что я не использую Rails framework.Как избежать строки в Ruby для защиты от SQL Injection? (No Rails)
Спасибо.
Если возможно, используйте модуль рубин 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. Другие параметры аналогичным образом правильно цитируются и вставляются в запрос.
Вам не нужно использовать рельсы, вы можете просто require 'activerecord'
и использовать его так же, как в рельсах (определите модели и используйте их). То, что вы делаете, просто заново изобретает колесо.
Напишите функцию wee, чтобы указать строки. Я думаю, что Rails просто использует что-то вроде этого:
def quote_string(v)
v.to_s.gsub(/\\/, '\&\&').gsub(/'/, "''")
end
См. Ответ greyfade. Или Энди Лестера. Это всего лишь плохая идея. –
Иногда вы работаете над одноразовым сценарием миграции и не устанавливаете никаких дополнительных драгоценных камней (без рельсов или dbi), и когда это произойдет, это эффективное решение. В любой другой ситуации вы должны, конечно, использовать подготовленные заявления. –
Не пытайтесь дезинфицировать ваши данные. Используйте подготовленные заявления. См. Также http://bobby-tables.com/ruby.html
Зачем даже вставлять поле id? При нормальном дизайне это будет автоматически увеличиваться. –
Это всего лишь пример. Но обратите внимание, что первый параметр для выполнения() просто равен нулю, а соответствующий параметр в запросе (первый знак вопроса) - для id. В этом примере «id» вставляется как NULL. – greyfade
Я хотел знать то же самое, что и OP, но я хотел просто написать инструкции SQL в файл, так что, я думаю, что подготовленные выписки из таблицы? Могу ли я (ab) использовать .inspect для экранирования строк? – Jan