如何编写 sa“f”e Active Record 查询

How to write sa"f"e Active Record queries

提问人:Ivan 提问时间:9/3/2018 最后编辑:Ivan 更新时间:9/4/2018 访问量:58

问:

我尝试在 Rails 中创建一个 API,可以动态调用该 API 以返回不同时间段内数据的最小值/最大值/平均值。 我有一些这样的范围:

  scope :span, ->(span) { group("date_round_down(device_time, '#{span}')::timestamp without time zone") }
  scope :func, ->(func) { calculate("#{func}", 'point_data_val') }

但是组方法不允许我做参数和?像“where”这样的替换。

有没有一种安全的方法可以将参数放入 Rails 中 SQL 字符串的中间?

Ruby-on-Rails SQL注入

评论

0赞 max 9/3/2018
这两者都不起作用,因为占位符是转义的,因此它不能用作列名。举个例子。我会考虑改用白名单,并使用它来构造SQL字符串。.where.where('? = 1', 'id')
0赞 Roman Kiselenko 9/3/2018
你选择了一个错误的方法,返回一个值数组,尝试一个普通的方法定义。scope
0赞 max 9/3/2018
实际上,scope 只是声明类方法@Зелёный的语法糖。您可以返回任何您想要的东西,例如.当然,这样做是很愚蠢的。它通常用于返回对象而不是数组。scope :foo, -> { "bar" }ActiveRecord::Relation

答:

0赞 max 9/3/2018 #1

我能弄清楚的唯一“安全”方法是通过白名单传递用户输入,例如可以获取的列名或用户可以在查询中应用的可接受聚合函数的审查列表。.column_names

直接将用户输入插入到查询中将使您容易受到 SQL 注入攻击,并且正常的卫生不适用于这种相当特殊的情况,因为它用于绑定和清理值 - 而不是列名或 SQL 关键字,这将是危险的,而且从框架 POV 来看相当愚蠢。