web-dev-qa-db-ja.com

クエリのような安全なActiveRecord

LIKEクエリを作成しようとしています。

純粋な文字列の要求は安全ではないことを読みましたが、安全なLIKE Hash Queryの記述方法を説明するドキュメントは見つかりませんでした。

出来ますか? SQLインジェクションを手動で防御する必要がありますか?

72
Gal Weiss

クエリ文字列が適切にサニタイズされるようにするには、配列またはハッシュクエリ構文を使用して条件を記述します。

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

または:

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

query%文字が含まれている可能性がある場合は、最初に sanitize_sql_likequeryをサニタイズする必要があります。

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

Arelを使用すると、この安全で移植可能なクエリを実行できます。

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

PostgreSQLの場合は

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

できるよ

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