在我的 Rails 3.2 应用程序中,Brakeman 1.8.3 为模型中的以下代码引发了高置信度 SQL 注入警告:
微博.rb
def self.from_users_followed_by(user)
followed_user_ids = Relationship.select(:followed_id).
where("follower_id = :user_id").
to_sql
where("user_id IN (#{followed_user_ids}) OR user_id = :user_id",
user_id: user.id)
end
但是,当我将代码更改为不使用 Arel 语法时,不会引发警告:
def self.from_users_followed_by(user)
followed_user_ids = "SELECT followed_id FROM relationships
WHERE follower_id = :user_id"
where("user_id IN (#{followed_user_ids}) OR user_id = :user_id",
user_id: user.id)
end
这是误报,还是与 Arel 语法或to_sql
方法有关……?我不明白在两个示例中执行的实际代码之间有什么区别,这两个示例需要警告。