web-dev-qa-db-fra.com

Safe ActiveRecord comme requête

J'essaie d'écrire LIKE requête.

J'ai lu que les requêtes de chaînes pures n'étaient pas sécurisées, mais je n'ai trouvé aucune documentation expliquant comment écrire en toute sécurité LIKE Hash Query.

C'est possible? Devrais-je me défendre manuellement contre l'injection SQL?

72
Gal Weiss

Pour vous assurer que votre chaîne de requête est correctement filtrée, utilisez le tableau ou la syntaxe de requête de hachage pour décrire vos conditions:

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

ou:

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

S'il est possible que le query puisse inclure le % caractère alors vous devez assainir query avec sanitize_sql_like premier:

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

En utilisant Arel, vous pouvez effectuer cette requête sécurisée et portable:

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

Pour PostgreSQL, ce sera

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

Tu peux faire

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