我的user_ransaker.rb文件中有以下代码:
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语句,那么如果我需要插入值,我可以使用?占位符。我真的不确定如何修复此警告。如果这是一个有效的警告,我如何纠正它?
发布于 2021-04-24 04:39:36
如果你要Arel,那就做一些关系代数:
class User < ApplicationRecord
def self.new_donor_sql
arel_table.project(arel_table[:user_id]).distinct
end
endransacker :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
endhttps://stackoverflow.com/questions/67235935
复制相似问题