首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails Brakeman: Arel的SQL注入

Rails Brakeman: Arel的SQL注入
EN

Stack Overflow用户
提问于 2021-04-24 03:37:30
回答 1查看 202关注 0票数 1

我的user_ransaker.rb文件中有以下代码:

代码语言:javascript
复制
ransacker :new_donors do
      sql = %{(
              users.id IN (
                #{User.new_donor_sql}
              )
            )}
      Arel.sql(sql)
    end

user.rb模型上:

代码语言:javascript
复制
def self.new_donor_sql
    part_1 = %{(
      SELECT distinct(user_id)
      FROM donations
    }
    part_1
end

对于上面的声明,我得到了以下Brakeman警告:

代码语言:javascript
复制
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语句,那么如果我需要插入值,我可以使用?占位符。我真的不确定如何修复此警告。如果这是一个有效的警告,我如何纠正它?

EN

回答 1

Stack Overflow用户

发布于 2021-04-24 04:39:36

如果你要Arel,那就做一些关系代数:

代码语言:javascript
复制
class User < ApplicationRecord
  def self.new_donor_sql
    arel_table.project(arel_table[:user_id]).distinct
  end
end
代码语言:javascript
复制
ransacker :new_donors do
  User.arel_table.then do |users|
    users.where(users[:id].in(User.new_donor_sql)).where_sql
  end
end

您也可以直接删除类方法:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67235935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档