Проверьте, что ваш проект Supabase показывает миру
Ключ anon и должен быть публичным. Защищает Row Level Security — а единственный ключ, который её обходит, никогда не должен попасть в браузер. Мы проверяем и то и другое снаружи, как это сделал бы атакующий, не трогая ваши данные.
Бесплатно, без регистрации. Базовая проверка делает только те запросы, которые выполняет обычный браузер.
Что мы проверяем
- КритичноБесплатная проверка
Ключ service_role или sb_secret во фронтенде
Оба полностью обходят Row Level Security. Мы ищем их на странице и в её скриптах и показываем ключ замаскированным вместе с файлом, где он лежит.
- КритичноPro
Таблицы читаются ключом anon
После подтверждения домена мы отправляем один HEAD-запрос на каждую таблицу, которую использует приложение, и сообщаем, сколько строк может прочитать кто угодно. Содержимое никогда не запрашивается.
- СправочноPro
Таблицы под защитой RLS
Таблицы, которые возвращают ключу anon ноль строк, тоже попадают в список — видно, что политика делает свою работу.
- СправочноБесплатная проверка
С каким проектом работает приложение
Проект Supabase и тип ключа, найденные на странице. Ключ anon или publishable ожидаем и находкой не считается.
Проверьте сами за пять минут
Всё, что мы проверяем снаружи, вы можете проверить в своей панели и терминале. Делайте это только на своём проекте.
Найдите таблицы без 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;
Попробуйте как посторонний
Возьмите ключ anon со своего сайта — тот же, что есть у каждого посетителя. Если запрос возвращает строки, то он вернёт их и любому другому.
curl 'https://<project>.supabase.co/rest/v1/<table>?select=*&limit=1' \ -H "apikey: <anon key>" \ -H "Authorization: Bearer <anon key>"
Убедитесь, что секретный ключ так и не попал в браузер
На работающем сайте откройте DevTools и поищите по всем загруженным файлам (Cmd/Ctrl + Option/Alt + F) service_role и sb_secret_. Любое совпадение значит: перевыпустите ключ в Project Settings → API, затем перенесите этот код в Edge Function.
Включите 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 — это утечка?
Нет. Он публичный по замыслу. Мы показываем его как справку, а не как проблему.
Вставьте адрес. Список будет примерно через минуту.
К каждой находке — что она значит для вас и как её исправить. Или промпт, который применит ваш ИИ-инструмент для кода.
Бесплатно, без регистрации. Базовая проверка делает только те запросы, которые выполняет обычный браузер.