ActiveRecord:SQL注入抗性

时间:2011-06-19 22:14:24

标签: ruby-on-rails activerecord sql-injection

我正在尝试构建一个微型引擎,允许用户输入即时构建搜索查询。我在params中得到列名和搜索字符串,我们假设:

params = {:filter_column => "column_name", :filter_string => "search term"}

我知道,如果我只是在我的模型上调用标准类型,那将是:

ModelName.where("column_name LIKE ?", params[:filter_string])

我遇到的问题是我正在尝试编译我的过滤器列表,然后一次一个地应用它们进行搜索。在调用where方法之前,我可以构建where字符串吗?

我试过了:

ModelName.where("? LIKE ? ", column_name, search_term)
没有太多运气。任何提示,技巧或指示?

谢谢!

2 个答案:

答案 0 :(得分:2)

您可能想尝试使用Metawhere Gem

的解决方案 我正在考虑这样的事情:

Model.where(params[:filter_column].intern.matches => params[:filter_string])

你可以在它自己的条件中按顺序构建每一个,用逗号或后续的where调用。

答案 1 :(得分:-1)

如果只有你可以改变column_name的内容(即没有注射风险),那么使用

是没有害处的
ModelName.where("`#{column_name}` LIKE ?", search_term)