代码之家  ›  专栏  ›  技术社区  ›  ivan

这是否应被视为SQL注入风险?

  •  0
  • ivan  · 技术社区  · 10 年前

    假设我有一个有3种型号的Rails应用程序: Job , Contractor , Bid 。当承包商对某项工作进行投标时,将使用适当的 contractor_id job_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似乎无法安全地插入 连接 字符串,就像它对 where (带有 ? 或命名参数)。

    1 回复  |  直到 10 年前
        1
  •  1
  •   Sean Huber    10 年前

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