提问人:farha 提问时间:4/24/2021 最后编辑:farha 更新时间:4/24/2021 访问量:579
Rails Brakeman:Arel 的 SQL 注入
Rails Brakeman: SQL Injection for Arel
问:
我的文件中有以下代码: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 语句,如果我需要插值,我可以使用占位符。我不太确定如何解决此警告。如果这是有效的警告,我该如何修正它??
答:
1赞
max
4/24/2021
#1
如果你要去 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
评论
0赞
farha
5/4/2021
我得到undefined method then for #<Arel::Table
0赞
max
5/4/2021
您使用的是哪个版本的 Ruby? 在 2.6 中作为别名引入 - 旧版本是 EOL。如果确实必须对旧版应用使用旧版本,请改为分配一个变量Object#then
Object#yield_self
users = User.arel_table; subquery = users.project(users[:user_id]).distinct; users.where(users[:id].in(subquery)).where_sql
下一个:如何修复订单轨查询中的sql注入
评论
undefined method 'eq' for ....