sql - 修复 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
直接在查询中添加来修复它,但后来出现了多个错误。
感谢您对此重构的建议。
解决方案
包装 ActiveRecord 的connection.quote()
,包装client_id
在这个方法中,例如,在你的情况下,试试这个
"WHERE portfolios.client_id = #{connection.quote(client_id)}"
我之前也从刹车手那里得到了这些错误,这解决了它。
推荐阅读
- styles - 如何修改 docsify prismjs 代码块的字体大小?
- discord - Discord JS 成员数
- javascript - 如何在 Nodejs 中为 DynamoDB PartiQL 指定参数
- apache-spark - 将数据帧写入本地路径遇到错误
- ios - 是否可以在本地 SPM 包中添加本地框架?
- php - 从 WooCommerce 查询中获取订单 ID 和订单日期
- java - 消耗大量互联网数据的 Java(TM) Platform SE 二进制文件(后台 Maven)
- dojo - dojox.av.FLAudio 和 Adobe Flash 播放器
- angular - 如何以角度自动刷新页面/组件视图
- python - 当我的机器人应该只给触发它的用户一个角色时,它会给每个人一个角色