как экранировать строку перед вставкой или обновлением в Ruby - PullRequest
6 голосов
/ 24 декабря 2010

В ruby ​​ActiveRecord не обеспечивает динамическое связывание для обновления и вставки sqls, конечно, я могу использовать raw sql, но для этого нужно поддерживать соединение, поэтому я хочу знать, есть ли более простой способ избежать обновления или вставить sql перед выполнениемкак код ниже:

ActiveRecord::Base.connection.insert(sql)

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

Ответы [ 3 ]

15 голосов
/ 01 сентября 2012

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

evil_input = '"\';%#{}\"foo'
ActiveRecord::Base.connection.quote(evil_input)
=> "'\"'';%\#{}\\\"foo'"
10 голосов
/ 24 декабря 2010

Вы можете сделать это:

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

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

0 голосов
/ 24 декабря 2010

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

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

Если вы хотите использовать параметры SQL вместо вставки переменных в операторы "update" или "insert", чтобы избежать внедрения SQL, используйте AR * привязки переменных . Прокрутите вниз до раздела «Условия».

...