Рельсы ActiveRecord заменяет sanitize_sql? в строке - PullRequest
0 голосов
/ 14 января 2019

У меня есть простой 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 или какой-либо другой вариант буквенные символы ?, чтобы они не заменялись? Есть ли какой-нибудь способ избежать их?

1 Ответ

0 голосов
/ 18 января 2019

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

Чтобы разрешить его для этого одного запроса, я в итоге использовал функцию SQL chr(), чтобы сгенерировать символ, который бы не трогал шаг очистки:

select 'http://www.google.com' || chr(63) || 'q=' || res from some_table where a = ?;

ASCII символ 63 - ?.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...