Нет авторизации: любой видит чужие данные
Чужие данные видны, когда приложение проверяет права только во фронтенде: прячет кнопки, но сервер или база отдают любую запись по её номеру. Проверка «этот пользователь может видеть эту запись» должна выполняться на сервере или в правилах базы при каждом запросе, а идентификатор пользователя брать из сессии, а не из запроса.
Первая помощь и как чиним
- 1Проверить вручную
Заходим вторым пользователем и пробуем открыть чужие записи по адресу и через API.
- 2Составить карту доступа
Кто и что может видеть и менять: гость, клиент, менеджер, админ.
- 3Закрыть на сервере
Проверка владельца в каждом эндпоинте, пользователь берётся из сессии или токена.
- 4Закрыть в базе
RLS в Supabase или правила Firebase как второй рубеж защиты.
- 5Закрепить тестами
Автотесты, которые проверяют, что чужой пользователь получает отказ.
Чинить самому или отдать в «аптечку»
Мы уже наступили на эти грабли — вам не придётся
Аптечка: что с проектом?
3 вопроса — и мы скажем, сколько стоит починка. Чек-лист безопасности проекта в подарок.
Интервью с собственником и РОПом, аудит текущей CRM и источников заявок.
1–3 дняВоронки, роли, точки контроля. Согласуем до того, как что-то настраивать.
3–5 днейНастраиваем Битрикс24 и дописываем недостающие инструменты. Демо каждую неделю.
1–4 неделиОбучение, база знаний, поддержка. Дорабатываем, пока цифры не поедут вверх.
дальше — с вамиПодробнееразвёрнутое описание, этапы и нюансы
Самая неприятная находка в вайб-код проекте — это не баг, а дыра: пользователь меняет в адресе /orders/1052 на /orders/1051 и видит чужой заказ, телефон и адрес. Такую уязвимость называют IDOR, и она входит в число самых распространённых в веб-приложениях. ИИ делает её особенно часто, потому что проверку прав нужно продумать, а не просто написать.
Почему так происходит
- Защита только во фронтенде. Кнопка «Админка» скрыта для обычных пользователей, но адрес
/api/admin/usersотвечает всем. - Доверие к данным из запроса. Сервер берёт
userIdиз тела запроса или параметра, а не из сессии. Подставить чужой номер может любой. - Нет фильтра по владельцу. Запрос
select * from orders where id = $1без условия на владельца. - Открытые правила базы. Firebase в тестовом режиме разрешает читать и писать всем до указанной даты. Supabase с выключенным RLS открывает таблицу любому, у кого есть публичный ключ — а он в коде вашего сайта.
- Секретный ключ во фронтенде. Ключ, обходящий все правила, оказался в браузере.
Что проверить самому
- Создайте два тестовых аккаунта. Под первым откройте свой заказ или профиль, скопируйте адрес, затем войдите вторым и откройте этот адрес.
- В DevTools → Network посмотрите API-запросы. Попробуйте повторить запрос с другим номером записи.
- Попробуйте открыть админские адреса, не входя в систему.
- В Firebase откройте Rules. Опасный признак:
allow read, write: if true;
или условие только по дате request.time < timestamp.date(...).
- В Supabase проверьте, что RLS включён на всех таблицах с данными пользователей.
- Поищите в коде сервера места, где пользователь берётся из
req.bodyилиreq.query.
Если хотя бы одна проверка «пробила» — не откладывайте, а заодно проверьте, нет ли секретных ключей в коде страницы.
Когда звать разработчика. Если дыра найдена, первое — временно закрыть доступ: отключить эндпоинт, включить RLS или поставить строгие правила Firebase, даже если часть функций перестанет работать. Дальше нужен разработчик, который проверит все точки доступа, а не только найденную: такие ошибки обычно системные, и одна найденная означает, что тот же подход повторён в других местах проекта.
Как чиним мы
Проводим аудит всех точек доступа к данным: эндпоинты, прямые запросы к базе из фронтенда, правила Firebase или RLS в Supabase. Составляем матрицу ролей и прав, вводим проверку владельца в каждом запросе, переносим определение пользователя в сессию или проверенный токен, закрываем админские маршруты. Добавляем автотесты «чужой пользователь получает 403». По логам помогаем оценить, были ли обращения к чужим записям. Подробнее — на странице «Аптечка вайб-кода».
Сколько стоит
Диагностика — 50 000 ₸, аудит безопасности и исправление доступа — 60 000 ₸, итого от 110 000 ₸ для небольшого проекта. Для кабинетов с ролями и большим количеством таблиц действует коэффициент размера. Рассчитайте в калькуляторе.
Частые вопросы
У меня есть вход по паролю. Разве это не авторизация?
Вход — это аутентификация: система знает, кто вы. Авторизация — проверка, что вам можно видеть конкретную запись. ИИ часто делает первое и забывает второе.
Если номера заказов случайные, этого достаточно?
Нет. Случайные идентификаторы усложняют перебор, но не заменяют проверку прав: ссылка может утечь в письме, логах или скриншоте.
Нужно ли сообщать клиентам, если данные уже могли утечь?
Это юридический вопрос, зависящий от данных и закона о персональных данных РК. Технически мы поможем понять по логам, был ли доступ к чужим записям.
Сделаем так же у вас
Короткий созвон — и вы знаете срок и цену. Или посчитайте сами за 2 минуты.