2015-08-08 2 views
0

Скажем, у меня есть приложение Rails с тремя моделями: Job, Contractor, Bid. Когда подрядчик делает ставку на работу, ставка создается с соответствующими contractor_id и job_id. Теперь я хотел бы, чтобы определить объем работы, что данный подрядчик возвращает задания они не еще на торгах:Следует ли считать этот риск инъекцией SQL?

class Job < ActiveRecord::Base 
    scope :not_bid_on_by, -> (contractor) do 
    joins(%{ 
     LEFT JOIN bids ON bids.job_id = jobs.id 
     AND bids.contractor_id = #{ contractor.id } 
    }).where(bids: { id: nil }) 
    end 
end 

Несмотря на то, что значение интерполированное непосредственно в joins строку, я не может думать о случае, когда этот пример был бы уязвим для SQL-инъекции, поскольку он только интерполирует поле id из данного аргумента. Я знаю, что это плохая практика в целом, но это похоже на доброкачественный экземпляр.

Если я ошибаюсь, и это является угрозой безопасности, существует ли более безопасный способ сделать это? У ActiveRecord нет возможности безопасно интерполировать строку joins, как и для where? или именованными параметрами).

ответ

1

Попробуйте использовать sanitize_sql_array метод ActiveRecord в: http://api.rubyonrails.org/classes/ActiveRecord/Sanitization/ClassMethods.html#method-i-sanitize_sql_array

Пример:

class Job < ActiveRecord::Base 
    scope :not_bid_on_by, -> (contractor) do 
    joins(sanitize_sql_array [%{ 
     LEFT JOIN bids ON bids.job_id = jobs.id 
     AND bids.contractor_id = ? 
    }, contractor.id]).where(bids: { id: nil }) 
    end 
end 
+0

Совершенная. Это хороший инструмент, о котором нужно знать. Благодаря! – ivan

Смежные вопросы