使用Arel语法时,Rails Brakeman SQL注入警告



在我的Rails 3.2应用程序中,Brakeman 1.8.3对模型中的以下代码发出了高置信度SQL注入警告:

micropost.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方法有关。。。?我不明白在两个例子中执行的实际代码之间有什么区别,这两个例子可以保证发出警告。

这是一个假阳性。

在这种情况下,Brakeman知道Relationship是一个模型,selectwhere是查询方法。因此,它假设Relationship.select(...).where(...).to_sql是一个记录属性(并且具有潜在的危险性)。但不应该这样做,因为to_sql只是为您提到的查询生成SQL代码。我会解决的。

第二个版本当然不会发出警告,因为您正在插入字符串文字。

相关内容

  • 没有找到相关文章

最新更新