在我的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
方法有关...?我不明白在两个可以保证警告的例子中执行的实际代码之间有什么区别。
答案 0 :(得分:3)
这是误报。
在这种情况下,Brakeman知道Relationship
是一个模型,而select
和where
是查询方法。所以它假设Relationship.select(...).where(...).to_sql
是一个记录属性(并且有潜在危险)。但是,它不应该,因为to_sql
只是为您提到的查询生成SQL代码。我会解决这个问题。
当然第二个版本没有警告,因为你正在插入一个字符串文字。