如何解决Rails Brakeman:Arel 的 SQL 注入
ransacker :new_donors do
sql = %{(
users.id IN (
#{User.new_donor_sql}
)
)}
Arel.sql(sql)
end
在 user.rb
模型上:
def self.new_donor_sql
part_1 = %{(
SELECT distinct(user_id)
FROM donations
}
part_1
end
对于上述声明,我收到以下 Brakeman 警告:
Confidence: High
Category: sql Injection
Check: sql
Message: Possible sql injection
Code: Arel.sql("(\n users.id IN (\n #{User.new_donor_sql}\n)\n)")
File: app/models/concerns/user_ransackers.rb
这是一个有效的错误吗?如果我使用 ActiveRecord 编写 sql 语句,并且需要插入值,我可以使用 ?
占位符。我不确定如何解决此警告。如果这是一个有效警告,我该如何补救?
解决方法
如果你要去 Arel,那就做一些关系代数:
class User < ApplicationRecord
def self.new_donor_sql
arel_table.project(arel_table[:user_id]).distinct
end
end
ransacker :new_donors do
User.arel_table.then do |users|
users.where(users[:id].in(User.new_donor_sql)).where_sql
end
end
您也可以删除类方法:
ransacker :new_donors do
User.arel_table.then do |users|
subquery = users.project(users[:user_id]).distinct
users.where(users[:id].in(subquery)).where_sql
end
end
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。