LIKE 쿼리를 작성하려고합니다.
순수한 문자열 요구 사항이 안전하지 않다는 것을 읽었지만 안전한 LIKE 해시 쿼리를 작성하는 방법을 설명하는 문서를 찾을 수 없습니다.
가능합니까? SQL Injection을 수동으로 방어해야합니까?
답변
쿼리 문자열이 제대로 삭제되었는지 확인하려면 배열 또는 해시 쿼리 구문을 사용하여 조건을 설명합니다.
Foo.where("bar LIKE ?", "%#{query}%")
또는:
Foo.where("bar LIKE :query", query: "%#{query}%")
그것은이 가능성이있는 경우 query
인클루드 수있는 %
문자를 당신은 위생적으로 필요 query
로 sanitize_sql_like
첫째 :
Foo.where("bar LIKE ?", "%#{sanitize_sql_like(query)}%")
Foo.where("bar LIKE :query", query: "%#{sanitize_sql_like(query)}%")
답변
Arel을 사용하면 다음과 같은 안전하고 이식 가능한 쿼리를 수행 할 수 있습니다.
title = Model.arel_table[:title]
Model.where(title.matches("%#{query}%"))
답변
PostgreSQL의 경우
Foo.where("bar ILIKE ?", "%#{query}%")
답변
넌 할 수있어
MyModel.where(["title LIKE ?", "%#{params[:query]}%"])
답변
중첩 된 연결에 대해 검색 쿼리를 수행하는 사람이있는 경우 다음을 시도하십시오.
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
모델 이름 으로 바꾸는 것을 잊지 마십시오