G-FORCE
0.0G
разгон
← все разборы

Права доступа только на фронтенде — это не права доступа


! Проблема

В системе управления задачами были три роли: админ, менеджер, исполнитель. Исполнитель не должен видеть отчёты по другим сотрудникам. Я аккуратно прятал кнопки и разделы в React в зависимости от роли — и считал задачу закрытой.

Решение

Продублировал все проверки на стороне данных: Firestore Security Rules описывают, кто какие документы вообще может прочитать. Клиентские проверки оставил — но теперь понимаю их роль правильно: это удобство интерфейса, а не защита. Заодно переписал структуру коллекций так, чтобы правила выражались просто, без ветвлений на полстраницы.

Как я к этому пришёл

Проверка была честная: если роль не подходит, компонент не рендерится. Выглядело надёжно.

Потом я открыл инструменты разработчика и посмотрел вкладку Network. Приложение спокойно скачивало из базы все задачи, включая чужие, а потом фильтровало их в браузере. Данные, которые пользователь не должен видеть, уже лежали у него в памяти вкладки. Спрятанная кнопка ничего не защищала.

Правильный ответ оказался архитектурным: ограничение должно стоять там, где данные отдаются, а не там, где рисуются. Security Rules описывают доступ на уровне документа, и обойти их из браузера нельзя.

Побочный вывод: если правило доступа получается сложным, обычно виновата структура данных. Я переразложил коллекции, и правила стали в три строки.

Чужие данные больше не покидают сервер. Интерфейс по-прежнему прячет лишнее — но теперь это про удобство, а не про безопасность.

Вывод

Всё, что проверяется только в браузере, не проверяется вообще. Клиент — это удобство, сервер — это правда.

Другие разборы