Безопасный запрос ActiveRecord
Я пытаюсь написать запрос LIKE.
Я читал, что чистые строковые запросы небезопасны, однако я не мог найти никакой документации, которая объясняла бы, как писать безопасный запрос LIKE Hash Query.
Возможно ли это? Должен ли я вручную защищаться от SQL Injection?
Ответы
Ответ 1
Чтобы убедиться, что строка запроса правильно очищена, используйте синтаксис массива или синтаксиса хеша для описания ваших условий:
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)}%")
Ответ 2
Используя Arel, вы можете выполнить этот безопасный и переносимый запрос:
title = Model.arel_table[:title]
Model.where(title.matches("%#{query}%"))
Ответ 3
Для PostgreSQL будет
Foo.where("bar ILIKE ?", "%#{query}%")
Ответ 4
Вы можете сделать
MyModel.where(["title LIKE ?", "%#{params[:query]}%"])