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

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

Безопасность Supabase: как проверить RLS и доступ к данным

Публичный ключ Supabase в браузере сам по себе не означает утечку. Важно, какие запросы разрешены grants и политиками RLS и какая пользовательская личность передана. Секретные ключи предназначены для доверенного сервера. Проверяйте анонимного посетителя и двух обычных пользователей: административный запрос не воспроизводит права клиента.

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

Проверить приложение на Supabase

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

Содержание

Как браузер получает доступ к данным

Браузер обращается к Data API проекта. Ключ определяет приложение, пользовательская сессия — личность, grants — доступ к операции, RLS — доступные строки. Это несколько уровней проверки, и они не заменяют друг друга. Скрытая таблица в интерфейсе не становится закрытой в базе. Схема ниже помогает определить, где именно принято решение, прежде чем менять SQL ради исчезновения ошибки.

Какие ключи публичные а какие секретные

Publishable предназначен для публичного клиента, secret — для доверенной серверной среды. Legacy anon и service_role имеют разные полномочия; service_role нельзя помещать в клиентскую сборку. Строка, похожая на JWT, не автоматически является секретом: определите назначение ключа по своему проекту. Сервер с повышенными полномочиями обязан самостоятельно проверять права пользователя перед запросом к данным.

КлючГде допустимОграничение
publishable / anonБраузер при корректной RLSНе предоставляет право обхода RLS
secret / service_roleТолько доверенный серверМожет обходить RLS; никогда в клиентском bundle
JWT пользователяКонтекст запроса пользователяПроверить подпись и права, не публиковать

Первичные источники: Supabase: RLS · Supabase: типы ключей

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

Как описать правила своей таблицы

Для учебной notes используем личного владельца owner_id. Запишите ожидания для SELECT, INSERT, UPDATE и DELETE отдельно: A читает и меняет свою заметку, B — свою, анонимный запрос не получает приватных строк. Командный доступ потребует дополнительной модели членства; простая проверка owner_id для него недостаточна. До создания новой политики проверьте существующие политики и grants, чтобы не оставить параллельный широкий доступ.

Минимальная политика чтения

Скачиваемая SQL-фикстура проверяет механизм RLS на изолированной PostgreSQL-базе с тестовой функцией личности. Это локальная проверка семантики политик, а не подключение к вашему облачному Supabase. Для использования в Supabase применяйте штатную auth.uid(), реальные роли и миграцию своего проекта. Тестовый владелец таблицы не должен подменять обычного пользователя при проверке: привилегированные контексты могут обходить ограничения.

Пример для Supabase; auth.uid() предоставляет платформа. В локальном скачиваемом стенде используется явно указанная тестовая функция.
alter table public.documents enable row level security;
create policy "owner reads" on public.documents
for select to authenticated
using (owner_id = (select auth.uid()));
-- Отдельные политики требуются для INSERT / UPDATE / DELETE.
-- UPDATE: USING проверяет старую строку, WITH CHECK — новую.

Первичные источники: Supabase: RLS · Supabase: типы ключей

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

Проверить приложение на Supabase

Как проверить запись и изменение владельца

USING определяет строки, с которыми можно работать; WITH CHECK проверяет допустимость результирующей строки при соответствующей операции. Не разрешайте A вставлять заметку от имени B или менять owner_id на B. На стенде сравните состояние до и после отказа. Сообщение new row violates row-level security policy может быть правильным результатом запрета, а не поводом отключить RLS.

Матрица из двух пользователей

Проверьте минимум шесть случаев: анонимное чтение, A→A, A→B, вставку owner_id=B от A, смену владельца и разрешённое изменение B→B. Для SELECT недоступная строка может просто отсутствовать в результате. Поэтому пустой список нужно сопоставлять с работающим контролем владельца. Матрица ниже даёт ожидаемые наблюдения, но не заменяет ваши правила общего доступа.

Сценарий локального SQL-стендаОжидание
A читает A1 строка
A читает B0 строк
B читает B1 строка
Аноним читает0 строк
A вставляет владельца BОтказ WITH CHECK
A меняет владельца на BОтказ WITH CHECK
После проверокТранзакция ROLLBACK

Первичные источники: Supabase: RLS · Supabase: типы ключей

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

Что проверить рядом с таблицами

Storage, views, функции и серверные маршруты с повышенными правами требуют самостоятельной проверки. Политика одной таблицы не доказывает защиту файлов или результата функции. Проверьте, какие контексты выполняют запрос и какие поля возвращаются клиенту. Scantelio может наблюдать настроенные HTTP-сценарии, но не получает административный обзор всех политик Supabase из публичного URL.

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

Сохраните исправление как миграцию, проверьте её на staging и повторите поведенческий тест после релиза. Владелец должен сохранять разрешённые действия. Если опубликован секрет с повышенными полномочиями, одной правки RLS недостаточно: ограничьте и отзовите этот доступ по процедуре провайдера. Для автоматического ретеста подготовьте обычные тестовые личности, известные объекты и ожидаемые права.

Продолжить: Проверка безопасности API с тестовыми аккаунтами

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

Проверено: guides-1 · PostgreSQL RLS (локальный стенд)

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

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

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

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

Publishable key в браузере — это утечка?

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

Можно оставить service_role на клиенте?

Нет. Опубликованный действующий секрет с повышенными правами нужно отозвать и проверить последствия его использования.

Включённая RLS означает безопасность?

Нужно проверить сами политики, привилегированные обходы и все пути доступа. Флаг включения недостаточен.

Почему пользователь получает пустой список?

Возможны правильная фильтрация, отсутствие данных или ошибка политики. Сравните с известной записью и контрольным запросом владельца.

Можно убрать RLS ради исправления ошибки?

Не используйте отключение защиты как исправление. Опишите разрешённое действие и проверьте подходящую политику.

Scantelio видит все настройки Supabase?

Нет. Проверка доступного HTTP-поведения не является административным аудитом базы, Storage и функций.

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

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

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

Проверить приложение на Supabase

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