这应该被视为SQL注入风险吗?

时间:2015-08-08 22:41:18

标签: activerecord sql-injection

假设我有一个包含3个模型的Rails应用:JobContractorBid。当承包商针对某个职位出价时,会使用相应的contractor_idjob_id创建出价。现在,我想定义一个工作范围,在给定承包商的情况下,返回他们但尚未出价的工作:

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 个答案:

答案 0 :(得分:1)

尝试使用ActiveRecord的sanitize_sql_array方法: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