我正在尝试编写LIKE查询。
我读到纯字符串quires不安全,但我找不到任何解释如何编写安全LIKE Hash Query的文档。
有可能吗?我应该手动防御SQL注入吗?
答案 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