Ответ 1
Вы должны изменить свой запрос следующим образом
User.where("first_name LIKE (?)", "%#{first_name}%")
Из активной активной записи рельсов руководство по SQL-инъекции
Этот код является очень предпочтительным:
Client.where( "orders_count =?", params [: orders])
к этому коду:
Client.where( "orders_count = # {params [: orders]}" )
Моя проблема в том, что я хочу использовать предложение LIKE с подстановочным знаком. Мой старый запрос выглядит так:
User.where("first_name LIKE '%#{first_name}%'")
Что уязвимо для SQL-инъекции, но если я это сделаю:
User.where("first_name LIKE '%?%'", first_name)
Затем полученный sql выглядит так:
SELECT "users".* FROM "users" WHERE (first_name LIKE '%'michael'%')
что является недопустимым из-за дополнительных одинарных кавычек.
Каков наилучший способ использования подстановочных знаков и предложение LIKE, а также защита от атак с SQL-инъекциями?
Вы должны изменить свой запрос следующим образом
User.where("first_name LIKE (?)", "%#{first_name}%")
Обновление: Rails улучшил это.
Arel позволяет создавать запросы с помощью простого DSL, и в качестве бонуса он включен в ActiveRecord. Вот пример вашего варианта использования.
User.where(User.arel_table[:first_name].matches("%#{first_name}%"))
Это сделает поиск без учета регистра, используя ILIKE
вместо LIKE
.