微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Rails Brakeman:Arel 的 SQL 注入

如何解决Rails Brakeman:Arel 的 SQL 注入

我的 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 语句,并且需要插入值,我可以使用 ? 占位符。我不确定如何解决此警告。如果这是一个有效警告,我该如何补救?

解决方法

如果你要去 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 举报,一经查实,本站将立刻删除。