Вопрос

В Ruby ActiveRecord не обеспечивает динамическое привязка для обновления и вставки SQL, конечно, я могу использовать RAW SQL, но это необходимо поддерживать соединение, поэтому я хочу знать, есть ли более простой способ избежать обновления или вставить SQL, прежде чем выполнять, как код ниже. :

ActiveRecord::Base.connection.insert(sql)

Я думаю, что я могу написать код GSUB, но я знаю, был ли был готовый метод для этого.

Это было полезно?

Решение

Вы могли бы сделать это:

ActiveRecord::Base.send(:sanitize_sql,["select * from my_table where description='%s' and id='%s'","mal'formed", 55], "my_table")

Конечно, это означает, что у вас есть параметры отдельно. Не уверен, что это сработает иначе, но попробуйте.

Другие советы

В Rails> = 3.2.5 Следующие работают для меня:

evil_input = '"\';%#{}\"foo'
ActiveRecord::Base.connection.quote(evil_input)
=> "'\"'';%\#{}\\\"foo'"

Неясно, что вы просите, потому что в вашем заголовке рассказывается о том, как сбежать из строки перед вставкой или обновлением, а затем в тегах, которые вы говорите о инъекции SQL.

Если вам нужно, чтобы Activerecord автоматически кодировал/изменял контент перед вставкой или обновлением, вы проверили Обратные вызовы Activerecord? А before_save Обратный вызов будет стрелять, когда вы делаете обновление или создаете. Если вы хотите изменить контент до его хранения, это хорошее место для этого.

Если вы хотите использовать параметры SQL вместо того, чтобы вставить переменные в ваши операторы «обновление» или «вставить», чтобы избежать инъекции SQL, тогда используйте AR переменные привязки. Анкет Прокрутите вниз к разделу «Условия».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top