这应该被视为 SQL 注入风险吗?
Should this be considered an SQL injection risk?
假设我有一个包含 3 个模型的 Rails 应用程序:Job
、Contractor
、Bid
。当承包商对工作进行投标时,将使用适当的 contractor_id
和 job_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
假设我有一个包含 3 个模型的 Rails 应用程序:Job
、Contractor
、Bid
。当承包商对工作进行投标时,将使用适当的 contractor_id
和 job_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