[ruby] 쿼리와 같은 안전한 ActiveRecord

LIKE 쿼리를 작성하려고합니다.

순수한 문자열 요구 사항이 안전하지 않다는 것을 읽었지만 안전한 LIKE 해시 쿼리를 작성하는 방법을 설명하는 문서를 찾을 수 없습니다.

가능합니까? SQL Injection을 수동으로 방어해야합니까?



답변

쿼리 문자열이 제대로 삭제되었는지 확인하려면 배열 또는 해시 쿼리 구문을 사용하여 조건을 설명합니다.

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

또는:

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

그것은이 가능성이있는 경우 query인클루드 수있는 %문자를 당신은 위생적으로 필요 querysanitize_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모델 이름 으로 바꾸는 것을 잊지 마십시오


답변