ActiveRecord用户提供的列名

时间:2014-06-10 23:03:57

标签: ruby-on-rails ruby activerecord

我试图允许rails应用程序的最终用户根据任意列的值限制结果。最简单的是,我想做一些大致等同于:

的事情
"SELECT * FROM products WHERE (#{params[:min_col]} >= #{params[:min]})"

没有注射漏洞。

例如,example.com/myapp/catalog?min_col=sell_price&min=300会返回sell_price大于或等于$ 3.00的所有商品

我尝试将这样的范围添加到模型中:

->(column,min) { where("? >= ?", column, min) }

并将uri参数传递给该范围,但这会产生

WHERE ('sell_price' >= '300')

似乎只是在比较两个文字字符串 - 这个查询和其他类似它总是返回每一行或没有行。如何获得与params中指定的列进行比较所需的行为?

1 个答案:

答案 0 :(得分:4)

要防止sql注入,您应该验证列是否有效

valid_cols = ["c1", "c2"]
valid_cols.include?(column) or raise "Bad query"

然后您可以像以前一样使用查询界面

Model.where("#{column} >= ?", min)