ActiveRecord用户提供的列名

xif*_*eng 3 ruby activerecord ruby-on-rails

我试图让Rails应用程序的最终用户根据任意列的值限制结果。最简单地说,我想做一些大致相当于:

"SELECT * FROM products WHERE (#{params[:min_col]} >= #{params[:min]})"
Run Code Online (Sandbox Code Playgroud)

没有注入漏洞。

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

我尝试将以下范围添加到模型:

->(column,min) { where("? >= ?", column, min) }
Run Code Online (Sandbox Code Playgroud)

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

WHERE ('sell_price' >= '300')
Run Code Online (Sandbox Code Playgroud)

这似乎只是在比较两个文字字符串-此查询和其他类似的字符串始终返回每一行或不返回任何行。如何获得与中指定的列进行比较的期望行为params

Fab*_*tor 5

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

valid_cols = ["c1", "c2"]
valid_cols.include?(column) or raise "Bad query"
Run Code Online (Sandbox Code Playgroud)

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

Model.where("#{column} >= ?", min)
Run Code Online (Sandbox Code Playgroud)