Проверьте, что ваш проект Supabase показывает миру

Ключ anon и должен быть публичным. Защищает Row Level Security — а единственный ключ, который её обходит, никогда не должен попасть в браузер. Мы проверяем и то и другое снаружи, как это сделал бы атакующий, не трогая ваши данные.

Бесплатно, без регистрации. Базовая проверка делает только те запросы, которые выполняет обычный браузер.

Посмотреть пример полного отчёта

Что мы проверяем

Проверьте сами за пять минут

Всё, что мы проверяем снаружи, вы можете проверить в своей панели и терминале. Делайте это только на своём проекте.

  1. Найдите таблицы без Row Level Security

    Панель Supabase → SQL Editor. Любую таблицу в схеме public с rowsecurity = false можно прочитать ключом anon, если действуют права доступа по умолчанию (default grants). Security Advisor (Advisors → Security) показывает тот же список.

    select tablename, rowsecurity
    from pg_tables
    where schemaname = 'public'
    order by rowsecurity, tablename;
  2. Попробуйте как посторонний

    Возьмите ключ anon со своего сайта — тот же, что есть у каждого посетителя. Если запрос возвращает строки, то он вернёт их и любому другому.

    curl 'https://<project>.supabase.co/rest/v1/<table>?select=*&limit=1' \
      -H "apikey: <anon key>" \
      -H "Authorization: Bearer <anon key>"
  3. Убедитесь, что секретный ключ так и не попал в браузер

    На работающем сайте откройте DevTools и поищите по всем загруженным файлам (Cmd/Ctrl + Option/Alt + F) service_role и sb_secret_. Любое совпадение значит: перевыпустите ключ в Project Settings → API, затем перенесите этот код в Edge Function.

  4. Включите RLS и добавьте политику

    Включённый RLS без политики блокирует всё — добавьте политику, которая соответствует тому, как используется таблица. Для таблицы профилей пользователей:

    alter table public.profiles enable row level security;
    
    create policy "read own profile"
    on public.profiles for select
    using (auth.uid() = id);

Исправление, которое применит ваш ИИ

Промпт из отчёта называет таблицы и конкретную проблему и просит ваш ИИ включить RLS с политиками, которые соответствуют тому, как приложение использует каждую таблицу.

Исправь эти проблемы на app.example.com.

1. Таблица "profiles" возвращает ключу anon 1240 строк.
   Включи на ней Row Level Security и добавь политику, чтобы пользователь мог выбирать только свою строку (auth.uid() = id).

2. Таблица "orders" возвращает ключу anon 87 строк.
   Включи RLS; разреши select только владельцу заказа.

Когда закончишь, проверь заново: https://scanyoursite.app/ru?check=app.example.com

Новая таблица — новый риск

Любая миграция может добавить таблицу без политики. На Pro проверка таблиц выполняется при каждой проверке по расписанию, и о новой открытой таблице вы узнаете в тот же день.

Посмотреть тарифы

Вопросы

Зачем подтверждать домен для проверки таблиц?

Запрос к базе данных выходит за рамки того, что браузер делает на странице, поэтому мы делаем это только для владельца. Для подтверждения нужна DNS-запись, файл или мета-тег.

Вы храните мои данные?

Нет. Мы считаем строки HEAD-запросом и сохраняем только число и имя таблицы.

Ключ anon — это утечка?

Нет. Он публичный по замыслу. Мы показываем его как справку, а не как проблему.

Для вайбкодеров

Вставьте адрес. Список будет примерно через минуту.

К каждой находке — что она значит для вас и как её исправить. Или промпт, который применит ваш ИИ-инструмент для кода.

Бесплатно, без регистрации. Базовая проверка делает только те запросы, которые выполняет обычный браузер.