0

在我的 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方法有关……?我不明白在两个示例中执行的实际代码之间有什么区别,这两个示例需要警告。

4

1 回答 1

3

这是一个误报。

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

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

于 2012-11-29T15:09:48.547 回答