安全的ActiveRecord就像查询一样

时间:2014-09-29 07:17:32

标签: ruby activerecord ruby-on-rails-4

我正在尝试编写LIKE查询。

我读到纯字符串quires不安全,但我找不到任何解释如何编写安全LIKE Hash Query的文档。

有可能吗?我应该手动防御SQL注入吗?

5 个答案:

答案 0 :(得分:132)

要确保您的查询字符串得到正确清理,请使用数组或哈希查询语法来描述您的条件:

Foo.where("bar LIKE ?", "%#{query}%")

或:

Foo.where("bar LIKE :query", query: "%#{query}%")

如果query可能包含%字符,那么您需要首先使用sanitize_sql_like清除query

Foo.where("bar LIKE ?", "%#{sanitize_sql_like(query)}%")
Foo.where("bar LIKE :query", query: "%#{sanitize_sql_like(query)}%")

答案 1 :(得分:28)

使用Arel,您可以执行此安全且可移植的查询:

title = Model.arel_table[:title]
Model.where(title.matches("%#{query}%"))

答案 2 :(得分:5)

对于PostgreSQL,它将是

Foo.where("bar ILIKE ?", "%#{query}%") 

答案 3 :(得分:1)

你可以做到

MyModel.where(["title LIKE ?", "%#{params[:query]}%"])

答案 4 :(得分:0)

如果有人对嵌套关联执行搜索查询,请尝试以下操作:

Model.joins(:association).where(
   Association.arel_table[:attr1].matches("%#{query}%")
)

对于多个属性,请尝试以下操作:

Model.joins(:association).where(
  AssociatedModelName.arel_table[:attr1].matches("%#{query}%")
    .or(AssociatedModelName.arel_table[:attr2].matches("%#{query}%"))
    .or(AssociatedModelName.arel_table[:attr3].matches("%#{query}%"))
)
 

别忘了用您的型号名称替换AssociatedModelName