Влияние
Неспособность реализовать безопасность на уровне строк (RLS) позволяет неаутентифицированным злоумышленникам запрашивать данные из базы данных Supabase, когда общедоступные таблицы доступны через анонимную границу [S1]. Поскольку приложения Next.js обычно предоставляют ключ Supabase anon в коде на стороне клиента, злоумышленник может использовать этот ключ для прямых вызовов REST API к базе данных, минуя предполагаемую логику приложения и получая доступ к конфиденциальной информации пользователя. [S2].
Основная причина
По умолчанию таблицы Postgres в Supabase требуют явной активации безопасности на уровне строк для предотвращения публичного доступа [S1]. Когда разработчик создает таблицу, но забывает включить RLS или не может определить ограничительные политики, база данных может предоставить данные любому, у кого есть ключ anon проекта [S1]. В приложениях Next.js рендеринг на стороне сервера и выборка на стороне клиента также требуют тщательной настройки клиента Supabase, чтобы контекст аутентифицированного пользователя достигал уровня базы данных [S2].
Конкретные исправления
- Включите RLS: Выполните
ALTER TABLE "your_table_name" ENABLE ROW LEVEL SECURITY;для каждой общедоступной таблицы, в которой хранятся данные приложения [S1]. - Определение политик. Создайте специальные политики, которые ограничивают доступ на основе статуса аутентификации пользователя, например
CREATE POLICY "Users can see their own data" ON your_table_name FOR SELECT USING (auth.uid() = user_id);[S1]. - Безопасные серверные клиенты. При использовании Next.js оставляйте клиенты сервисной роли только серверными и по-прежнему применяйте фильтры владения перед возвратом данных пользователям [S2].
Как FixVibe проверяет это
FixVibe уже выполняет проверку Supabase RLS только для чтения через baas.supabase-rls. Сканер обнаруживает URL-адрес проекта Supabase и открытый ключ анонима из пакетов JavaScript того же происхождения, запрашивает у PostgREST метаданные общедоступной таблицы и пытается выполнить ограниченный выбор только для чтения, чтобы подтвердить, доступны ли данные без сеанса пользователя. Он не вставляет, не обновляет, не удаляет и не использует учетные данные роли службы. Сканирование репозитория также может обнаружить это раньше с помощью repo.supabase.missing-rls, который помечает миграции SQL, которые создают общедоступные таблицы без ENABLE ROW LEVEL SECURITY.
