簡體   English   中英

ActiveRecord用戶提供的列名

[英]ActiveRecord user-supplied column name

我試圖允許Rails應用程序的最終用戶根據任意列的值來限制結果。 最簡單地說,我想做一些大致相當於:

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

沒有注入漏洞。

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

我嘗試將以下范圍添加到模型:

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

並將uri參數傳遞到該范圍,但這會產生

WHERE ('sell_price' >= '300')

這似乎只是在比較兩個文字字符串-此查詢和其他類似的字符串始終返回每一行或不返回任何行。 如何獲得與params指定的列進行比較的期望行為?

為防止sql注入,您應驗證該列是否為有效列

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

然后您可以像以前一樣使用查詢界面

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM