FixVibe
Covered by FixVibehigh

Защита Next.js + Supabase: предотвращение обходов безопасности на уровне строк (RLS)

Приложения, созданные с помощью Next.js и Supabase, часто используют безопасность уровня строк (RLS) для защиты данных. Неспособность включить RLS или неправильная настройка клиента Supabase может привести к полному раскрытию базы данных, что позволит неавторизованным пользователям читать или изменять конфиденциальные записи.

CWE-284

Влияние

Злоумышленники могут обойти логику приложения для чтения, обновления или удаления записей в базе данных, если безопасность уровня строк (RLS) не обеспечивается должным образом [S1]. Это часто приводит к раскрытию личной информации (PII) или конфиденциальных данных приложения пользователям, у которых есть доступ только к общедоступному анонимному ключу API.

Основная причина

Supabase использует Postgres Row Level Security для управления доступом к данным на уровне базы данных, что имеет основополагающее значение для защиты данных [S1]. В среде Next.js разработчики должны создать клиент Supabase, который правильно обрабатывает файлы cookie и сеансы для обеспечения безопасности во время рендеринга на стороне сервера [S2]. Уязвимости обычно возникают, когда:

  • Таблицы создаются без включения RLS, что делает их доступными через открытый анонимный ключ [S1].
  • Клиент Supabase неправильно настроен в Next.js, из-за чего не удается правильно передать токены аутентификации пользователя в базу данных [S2].
  • Разработчики случайно используют ключ service_role в клиентском коде, который обходит все политики RLS [S1].

Конкретные исправления

  • Включите RLS: убедитесь, что безопасность на уровне строк включена для каждой таблицы в вашей базе данных Supabase [S1].
  • Определение политик. Создайте определенные политики Postgres для операций SELECT, INSERT, UPDATE и DELETE, чтобы ограничить доступ на основе UID пользователя [S1].
  • Используйте SSR-клиенты. Внедрите пакет @supabase/ssr для создания клиентов в Next.js, которые правильно управляют аутентификацией на стороне сервера и сохранением сеанса [S2].

Как FixVibe проверяет это

FixVibe уже охватывает это посредством проверок развернутых приложений и репозиториев. Пассивный модуль baas.supabase-rls обнаруживает URL-адрес Supabase и пары анонимных ключей из пакетов JavaScript одного и того же происхождения, запрашивает у PostgREST метаданные общедоступной таблицы и выполняет ограниченный выбор только для чтения для подтверждения анонимного предоставления данных без изменения данных клиента. При сканировании репозитория также выполняется repo.supabase.missing-rls, чтобы пометить миграции SQL, которые создают общедоступные таблицы без ENABLE ROW LEVEL SECURITY, а при секретном сканировании выполняется поиск раскрытия ключа служебной роли до того, как он достигнет браузера.