Rails ActiveRecord escape переменная в предложении join
этот запрос работает, но полностью открыт для SQL-инъекции:
products = Product.find(pids,
:select => 'products.*, P.code',
:joins => "left join product_dist_match P on
(P.pid = products.pid and P.cid = #{cid})",
)
как я могу правильно избежать переменной cid? The conditions
параметр позволяет форматировать ['foo = ?', bar]
для этой цели, но joins
нет.
Я не хочу использовать find_by_sql
потому что тогда мне нужно будет добавить соединения и условия, которые являются частью области по умолчанию модели (это не будет сухим).
Edit: моя структура таблицы по существу это:
products: pid (primary key)
product_dist_match: pid, cid, code
customers (not used in the query): cid (primary key)
обратите внимание, что это база данных только для чтения, с которой Rails имеет ограниченное участие. Я не планирую настраивать модели для всех таблиц; я просто хочу сделать простой запрос, как описано выше, не подвергая себя атакам SQL-инъекций.
2 ответов
ответ, который я нашел-это использовать .sanitize
способ модели:
products = Product.find(pids,
:select => 'products.*, P.code',
:joins => 'left join product_dist_match P on
(P.pid = products.pid and P.cid = ' + Product.sanitize(cid) + ')',
)
Если вы найдете лучшее решение, пожалуйста, задайте его!
Кажется, это больше то, что вы пытались сделать.
products = Product.find(pids,
:select => 'products.*, P.code',
:joins => sanitize_sql_array [
'left join product_dist_match P on P.pid = products.pid and P.cid = ?',
cid
]