Подтвердить что ты не робот

Как использовать подстановочные знаки в активной записи, где предложение при защите от SQL-инъекции

Из активной активной записи рельсов руководство по 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-инъекциями?

4b9b3361

Ответ 1

Вы должны изменить свой запрос следующим образом

User.where("first_name LIKE (?)", "%#{first_name}%")

Ответ 2

Обновление: Rails улучшил это.

Arel позволяет создавать запросы с помощью простого DSL, и в качестве бонуса он включен в ActiveRecord. Вот пример вашего варианта использования.

User.where(User.arel_table[:first_name].matches("%#{first_name}%"))

Это сделает поиск без учета регистра, используя ILIKE вместо LIKE.