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
    ]