Получи случайную криптовалюту за регистрацию!

В недавно вышедшей Ruby on Rails 7.0 есть множество нововведен | Evil Martians

В недавно вышедшей 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 (Кто хочет поконтрибьютить в опенсорс? Вот хорошая задача!)

Используйте новые возможности языков и фреймворков с умом и меньше багов вам в наступившем году!