У меня есть простой SQL-запрос, написанный доверенным администратором, который должен быть запущен в приложении Rails (4.2). Я очищаю его с помощью ActiveRecord::Base.send(:sanitize_sql, ...)
, чтобы позволить пользовательским вводам выступать в качестве условий, используя символ ?
для переменных связывания. Код должен разрешать произвольный SQL, поэтому меня не интересуют аргументы о том, почему это не так, как в Rails и т. Д.
Проблема заключается в том, что я не могу включить ?
в поле результатов в SQL без базового replace_bind_variables
метода, заменяющего предполагаемый литерал ?
в результате.
Например, простой запрос:
select 'http://www.google.com?q=' || res from some_table where a = ?;
Для санации:
ActiveRecord::Base.send(:sanitize_sql, [sql, 'not me'], :some_table)
Очистка завершается неудачно, поскольку ?
в URL заменяется данными, предназначенными для условия, что приводит к исключению:
ActiveRecord::PreparedStatementInvalid: wrong number of bind variables (1 for 2)
Вопрос в том, разрешает ли sanitize_sql
или какой-либо другой вариант буквенные символы ?
, чтобы они не заменялись? Есть ли какой-нибудь способ избежать их?