首页 > 解决方案 > 修复 Rails 模型范围上的 sql 注入

问题描述

我一直在尝试重构一个模型范围,Brakeman 正在抱怨它,所以我认为修复它是一个好主意,因为我们被正在寻找我们网站漏洞的机器人扫描。

scope :cash_deal_aggregated, -> (filter = '') {
  select("deals.*")
  .from([Arel.sql(
    "(SELECT DISTINCT ON (COALESCE(cash_deal_details.cash_deal_id, 0.1*deals.id)) deals.*
      FROM deals
      INNER JOIN portfolios ON portfolios.id = deals.portfolio_id
      LEFT JOIN cash_deal_details ON deals.cash_deal_detail_id = cash_deal_details.id
      #{filter}) deals"
    )]
  )
}

上面的范围是这样使用的:

filter = "WHERE portfolios.client_id = #{client_id}"
deal_records = deal_records = Deal.cash_deal_aggregated(filter)

它也是这样使用的:

deal_records = Deal.cash_deal_aggregated

最初我试图通过filter直接在查询中添加来修复它,但后来出现了多个错误。

感谢您对此重构的建议。

标签: sqlruby-on-railspostgresqlarel

解决方案


包装 ActiveRecord 的connection.quote(),包装client_id在这个方法中,例如,在你的情况下,试试这个

"WHERE portfolios.client_id = #{connection.quote(client_id)}"

我之前也从刹车手那里得到了这些错误,这解决了它。


推荐阅读