Вы должны заботиться о внедрении SQL всякий раз, когда используете конкатенацию строк с любым пользовательским вводом для создания фрагментов SQL. Если вы используете параметры, все в порядке.
Например, это не уязвимо для SQL-инъекций:
Project.where("project_title LIKE ?", "%#{search.strip}%")
Но это уязвимо, поскольку параметр запроса записывается непосредственно в SQL-запрос, и база данных не может узнать, где заканчивается предполагаемый запрос, поэтому пользователь может вводить дополнительные части в этот запрос через search
параметр:
Project.where("project_title LIKE %#{search.strip}%")
Точно так же, если вы отправляете форму, вопрос заключается в том, как вы используете значения из запроса в результирующих запросах. Если вы всегда используете параметры, как в первом примере выше (с ?
или именованные с символами), и любой параметр запроса всегда назначается через параметры, ваше приложение не уязвимо. Если вы когда-нибудь смешаете параметры запроса с SQL-запросами в виде строки, как во втором примере, ваше приложение будет уязвимо для SQL-инъекций.
Итак, просто чтобы уточнить: любой вызов метода Rails защищен от SQL-инъекций, если вы используете ActiveRecord. Вам нужно беспокоиться только тогда, когда вы сами записываете части операторов SQL в виде строк и включаете параметры запроса в эту строку. Приведенный выше пример с LIKE несколько особенный, вам обычно не нужно создавать строки SQL самостоятельно с помощью ORM, такого как ActiveRecord.
15.11.2016