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

Should this be considered an SQL injection risk?

假设我有一个包含 3 个模型的 Rails 应用程序:JobContractorBid。当承包商对工作进行投标时,将使用适当的 contractor_idjob_id 创建投标。现在我想定义一个工作范围,给定一个承包商,returns 他们有 没有 尚未出价的工作:

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 似乎没有像 where 那样安全地插入 joins 字符串的方法(使用 ? 或命名参数)。

尝试使用 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