Нужно избегать SQL-инъекций в Rails3 - PullRequest
0 голосов
/ 03 мая 2018

Мне нужно переписать следующий код, избегая SQL-инъекций в Rails 3.

some_table_name.joins("inner join #{table_name} on linked_config_items.linked_type = '#{class_name}' and linked_config_items.linked_id = #{table_name}.id").
        where("#{table_name}.saved is true and #{table_name}.deleted_at is null")

Здесь имя_таблицы является динамическим, и оно будет различным.

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Наконец, мне пришлось переписать мой запрос выше, как этот

some_table_name.joins(self.class.superclass.send(:sanitize_sql_array,"inner join #{table_name} as t1 on linked_config_items.linked_type = '#{class_name}' and linked_config_items.linked_id = t1.id")).
          where("t1.saved is true and t1.deleted_at is null")

Здесь «self.class.superclass» - это «ActiveRecord :: Base»

0 голосов
/ 03 мая 2018

Идентификаторы SQL, такие как имена таблиц и столбцов, не могут быть заменены связанными параметрами, что является наиболее распространенным методом обеспечения защиты от уязвимостей внедрения SQL.

Лучшее решение для обеспечения безопасности вашего table_name - это внести его в белый список.

То есть перед интерполяцией его в ваш запрос используйте код, чтобы убедиться, что он совпадает с именем таблицы, которая существует в вашей базе данных. Многие приложения хранят кэш имен таблиц или каким-то образом отображают свои метаданные в код.

Также вы должны разделять динамические идентификаторы в бэк-тиках, поэтому в случае, если таблица допустима, но оказывается зарезервированным словом , она все равно будет работать.

some_table_name.joins("inner join `#{table_name}` as t1 ...

Также удобно использовать псевдонимы таблиц, как показано выше (as t1), поэтому вам не нужно повторять переменную Ruby несколько раз в запросе.

...