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?
为防止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)
| 归档时间: |
|
| 查看次数: |
835 次 |
| 最近记录: |