Перейти к содержанию

РУКОВОДСТВО 06 · ВЕБ-ПРИЛОЖЕНИЯ И API

Безопасность Next.js: проверка API Server Actions и секретов

В Next.js вход на страницу не определяет права всех серверных операций. Проследите путь от запроса до объекта и ответа клиенту: кто вызывает действие, какой projectId выбран и какие поля возвращаются. Проверьте другую личность и запрос без входа. Руководство относится к App Router; примеры необходимо сверять с версией развёрнутой сборки.

Редакция Scantelio · Обновлено

Проверить Next.js-приложение

Понадобятся вход, подтверждение владения и согласие. Для авторизованных сценариев, мониторинга и CI нужен Pro или Business.

Содержание

Где проходит граница доверия

Server Components выполняют серверную работу, Client Components получают предназначенные браузеру данные, Server Actions и Route Handlers принимают внешние обращения. Размещение кода на сервере не делает выбранный объект разрешённым. В нашем примере две организации и один документ каждой; проверяется право на объект, а не возможность увидеть страницу. Scantelio проверяет доступное поведение подготовленных сценариев, не читает статически все Server Actions вашего репозитория.

Права внутри Server Actions и маршрутов

Для изменения проекта получите действующую сессию и загрузите выбранный объект. Затем проверьте право редактирования в его организации. projectId из формы — входные данные, а не подтверждение полномочий. Повторите запрос без входа, от владельца и от другой организации. Проверка в middleware или proxy может быть полезным первым барьером, но решение по конкретной операции должно оставаться рядом с доступом к данным.

Псевдокод интеграции с вашей сессией и БД. Выполняемый пример Next.js 16.4.3 — в архиве ниже.
const actor = await requireSession();
const document = await db.document.findUnique({ where: { id } });
if (!document || document.ownerId !== actor.id) throw new Error("Forbidden");
return { id: document.id, title: document.title }; // без внутренних полей

Первичные источники: Next.js: безопасность данных · Next.js: переменные окружения

Продолжить: Утечка .env .git или API-ключа: как закрыть доступ и проверить исправление

Какие данные попадают в браузер

Не передавайте в клиентский компонент целиком запись пользователя или проекта из базы. Сформируйте DTO только с нужными полями, например id и displayName. Поле canEdit помогает нарисовать интерфейс, но не заменяет повторную серверную проверку при сохранении. В сетевом ответе не должно быть внутренних токенов, паролей или лишних данных другой организации. Проверяйте фактическую сериализацию, а не только видимые подписи на странице.

NEXT_PUBLIC и переменные окружения

NEXT_PUBLIC обозначает данные, предназначенные для браузерной сборки. Такой префикс не скрывает значение. В примере NEXT_PUBLIC_SUPPORT_URL — публичная ссылка, BILLING_SECRET — серверная настройка; значения вымышленные. Если секрет попал в клиентский артефакт, уберите причину публикации, отзовите полномочия и выпустите исправленную сборку. Одной смены переменной на сервере может быть недостаточно для уже опубликованных файлов.

ДанныеКуда попадаютПравило
NEXT_PUBLIC_*Клиентский buildТолько публичные значения
Серверный секретСерверное окружениеНе включать в DTO, логи и HTML
Результат Server ActionМожет попасть в браузерВернуть минимальный разрешённый DTO

Первичные источники: Next.js: безопасность данных · Next.js: переменные окружения

Продолжить: IDOR и BOLA: как проверить доступ к чужим данным в своём API

Проверить Next.js-приложение

Как проверить приватный кэш

Откройте приватный ответ под A, затем B и без входа; повторите после смены организации и выхода. Проверьте прямое обращение к маршруту и путь через CDN. Отсутствие маркера A у B — необходимый контроль. Кэширование зависит от используемых API, версии Next.js и внешнего прокси, поэтому здесь нет универсального обещания о безопасных настройках по умолчанию. Условие кэширования приватного ответа должно быть явно известно вашей команде.

Версия фреймворка и зависимости

Сохраните точную версию Next.js и других библиотек вместе с идентификатором опубликованной сборки. Баннер или заголовок, похожий на Next.js, не доказывает применимость конкретной CVE. Инвентарь должен соответствовать окружению, а не только последнему commit основной ветки. Обновление фреймворка устраняет определённые ошибки его реализации, но не добавляет отсутствующую проверку владельца в вашем приложении.

Первичные источники: Next.js: безопасность данных · Next.js: переменные окружения

Продолжить: Мониторинг CVE и зависимостей вашего приложения

Практический чек лист релиза

Проверьте прямой вызов без сессии, чужой объект, запрещённое поле роли, минимальный DTO, клиентские артефакты и версию релиза. Изменения выполняйте на staging с тестовыми записями. В каждом запрете нужен положительный контроль владельца. Чек-лист можно использовать независимо от способа создания приложения: Cursor и другой редактор не меняют границы доверия HTTP-запроса.

Как включить повторение в процесс

Закрепите найденную ошибку регрессионным тестом, выполните ретест после деплоя и свяжите его с нужной сборкой. В CI используйте проверенный интерфейс Scantelio, а не случайный Action с похожим названием. Если аккаунт истёк или правило пропущено, процесс релиза должен обработать неполное покрытие явно. Публичный скан и проверка исходников дополняют друг друга, но не являются взаимозаменяемыми.

Продолжить: Как добавить проверки безопасности в CI/CD и GitHub Actions

Воспроизводимые примеры и материалы

Проверено: guides-1 · Next.js 16.4.3

Учебные данные — синтетические. Файлы не содержат действующих ключей или клиентской базы. Запускайте примеры только в собственной изолированной тестовой среде.

Протокол проверки примера: версии, действия и наблюдения

Настоящий интерфейс находки: результат правила изоляции A/B на локальном учебном стенде; не полный скан и не клиентский проект
Настоящий интерфейс находки: результат правила изоляции A/B на локальном учебном стенде; не полный скан и не клиентский проект. Учебный стенд, синтетические данные.

Вопросы и ответы

use server автоматически защищает действие?

Нет. Нужны проверка личности и разрешения на конкретную операцию и объект.

Достаточно middleware или proxy?

Они могут ограничивать вход, но права на объект нужно проверять в доверенном коде самой операции.

NEXT_PUBLIC скрывает ключ?

Нет. Это публичное назначение переменной, которая может попасть в браузерную сборку.

Можно передать весь user в компонент?

Сначала проверьте сериализуемые поля. Безопаснее сформировать минимальный DTO с данными, которые действительно нужны интерфейсу.

Обновление Next.js исправляет бизнес-логику?

Нет. Исправления фреймворка и правила доступа вашего приложения — разные задачи.

Сканер найдёт все ошибки Server Actions?

Нет. Вывод относится к поддерживаемым доступным сценариям и подготовленным данным, а не ко всем серверным функциям.

Автор и источники

Редакция Scantelio: методика и границы проверки. Проверка примера: 2026-11-02.

Перенесите проверку на свой проект

Проверить Next.js-приложение

Выберите свой проект после входа. Ничего не сканируется без подтверждения и согласия.