提问人:Ivan 提问时间:9/3/2018 最后编辑:Ivan 更新时间:9/4/2018 访问量:58
如何编写 sa“f”e Active Record 查询
How to write sa"f"e Active Record queries
问:
我尝试在 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 字符串的中间?
答:
0赞
max
9/3/2018
#1
我能弄清楚的唯一“安全”方法是通过白名单传递用户输入,例如可以获取的列名或用户可以在查询中应用的可接受聚合函数的审查列表。.column_names
直接将用户输入插入到查询中将使您容易受到 SQL 注入攻击,并且正常的卫生不适用于这种相当特殊的情况,因为它用于绑定和清理值 - 而不是列名或 SQL 关键字,这将是危险的,而且从框架 POV 来看相当愚蠢。
评论
.where
.where('? = 1', 'id')
scope
scope :foo, -> { "bar" }
ActiveRecord::Relation