2022-01-10 19:39:03
В недавно вышедшей Ruby on Rails 7.0 есть множество нововведений: больших и малых, революционных и не очень, полезных и противоречивых.
Сегодня расскажем об одном противоречивом: полезном, но очень опасном при неаккуратном использовании. Знакомьтесь, метод invert_where в скоупах ActiveRecord.
С одной стороны, это очень удобная штука для быстрого получения обратных условий для выборки данных из базы: Post.published.invert_where и вуаля.
Но проблема кроется в том, что инвертируются
все where-условия, наложенные на скоуп, включая те, что были добавлены при сцеплении скоупов и в default_scope (который многие считают злом и небезосновательно).
При неаккуратном использовании можно сделать большую такую дыру в безопасности — например, выдать одному клиенту данные других клиентов в мультитенантном приложении.
Больше страшных примеров можно найти в этом блоге: blog.kiprosh.com/side-effects-of-activerecords-new-feature-invert_where-in-rails-7
А советы по безопасному использованию — в этом: jbhannah.net/articles/rails-7-using-invert-where-safely
И есть предложение написать копа в RuboCop-Rails, который будет помогать отлавливать потенциально небезопасное использование: github.com/rubocop/rubocop-rails/issues/470 (Кто хочет поконтрибьютить в опенсорс? Вот хорошая задача!)
Используйте новые возможности языков и фреймворков с умом и меньше багов вам в наступившем году!
1.2K viewsedited 16:39