在我的Rails 3.2应用程序中,制动器 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方法有关.?我不明白在两个值得警告的示例中执行的实际代码之间有什么区别。
发布于 2012-11-29 15:09:48
是假阳性。
在这种情况下,Brakeman知道Relationship是一个模型,select和where是查询方法。因此,它假定Relationship.select(...).where(...).to_sql是一个记录属性(并且具有潜在的危险性)。但是,它不应该这样做,因为正如您提到的那样,to_sql只是为查询生成SQL代码。我来解决这个问题。
当然,第二个版本不会发出警告,因为您正在插入字符串文本。
https://stackoverflow.com/questions/13624870
复制相似问题