Справочник «Вайбкодинг в России» · модуль 10 · Нейросеть в коде и в продукте
Глава 10.1
Открытая база
и ключи в коде
Самая частая ошибка приложений, собранных нейросетью, — база данных, которую может прочитать любой, кто открыл код страницы. В сентябре 2026 года исследователи UpGuard нашли больше 16 тысяч таких баз только на Supabase. По российскому закону открытая база с данными пользователей — это неисполнение обязанности защищать данные, а если в неё кто-то зашёл — утечка со штрафом до 15 млн ₽. В главе разобраны типовые дыры, кто за них отвечает и как проверить проект до запуска.
- Законы
- 152-ФЗ ст. 3, 19, 21 ч. 3.1 · КоАП РФ ст. 13.11 ч. 11–14 · УК РФ ст. 272, 272.1
- Уровень
- Базовый
- Связанные главы
- 3.5 Защита и утечка · 3.4 Локализация · 9.1 Брутфорс
- Зачем это знать
- Чтобы проект, собранный за вечер, не выложил базу учеников в открытый доступ
§1Как нейросеть оставляет базу открытой
Сервисы вроде Supabase и Firebase дают готовую базу данных, вход пользователей и хранилище файлов без собственного сервера. Страница сайта обращается к базе напрямую из браузера. Для этого в код страницы встраиваются адрес проекта и публичный ключ. Публичный ключ виден любому, кто откроет инструменты разработчика, и это предусмотрено устройством сервиса: доступ к данным должны ограничивать правила на стороне базы.
В Supabase такие правила называются RLS (Row Level Security, защита на уровне строк): для каждой таблицы задаётся, какие строки может читать и менять пользователь. Если RLS для таблицы выключен, публичного ключа достаточно, чтобы прочитать её целиком. В Firebase ту же роль играют правила безопасности (Security Rules). Нейросеть при генерации проекта часто выключает правила или оставляет разрешение «всем», потому что с ними первая версия не работает, а без них страница сразу показывает данные.
| Что сгенерировано | Что это значит | Как находят |
|---|---|---|
| Таблица в Supabase без RLS | Публичный ключ из кода страницы даёт чтение и запись всей таблицы | Ключ и адрес берут из JavaScript сайта и отправляют запрос к REST-интерфейсу базы |
Правило Firebase allow read, write: if true | Любой пользователь интернета читает и меняет данные | Автоматические сканеры проверяют адреса проектов Firebase |
Служебный ключ (service_role, ключ администратора) в коде страницы | Ключ обходит все правила доступа | Поиск строк вида eyJ… и sk-… в коде сайтов |
Файл .env с паролями в публичном репозитории | Пароль от базы, ключи платных API и платёжного сервиса опубликованы | Роботы обходят GitHub и находят ключи в течение минут после коммита |
Страница /admin без пароля | Админка доступна по прямой ссылке | Перебор типовых адресов |
| Публичное хранилище файлов | Сканы документов, договоры, выгрузки базы доступны по ссылке | Перебор имён хранилищ и файлов |
Масштаб показывает исследование компании UpGuard, опубликованное 25 сентября 2026 года (TechCrunch, BleepingComputer): 16 326 баз Supabase, таблицы которых можно было прочитать через интерфейс доступа к данным. Больше чем в половине из них, судя по названиям таблиц, хранились персональные данные: имена, адреса, телефоны, пароли, токены входа. Адрес проекта и ключ исследователи брали из открытого JavaScript-кода сайтов.
§2Кто отвечает за ошибку нейросети
Нейросеть, Supabase и GitHub не являются операторами персональных данных вашего проекта. Оператор — тот, кто определяет, зачем и какие данные собираются.
152-ФЗ «О персональных данных»ст. 3, п. 2ред. от 26.07.20262) оператор - государственный орган, муниципальный орган, юридическое или физическое лицо, самостоятельно или совместно с другими лицами организующие и (или) осуществляющие обработку персональных данных, а также определяющие цели обработки персональных данных, состав персональных данных, подлежащих обработке, действия (операции), совершаемые с персональными данными;
Для «КурсБлиновской» оператором данных своих клиентов — школ и авторов — является ООО «КурсБлиновской», а данных учеников — школы, которые поручили платформе их хранить (глава 3.1). Обязанность защищать данные лежит на операторе и не зависит от того, кто написал код: работник, подрядчик или нейросеть.
152-ФЗ «О персональных данных»ст. 19, ч. 1ред. от 26.07.20261. Оператор при обработке персональных данных обязан принимать необходимые правовые, организационные и технические меры или обеспечивать их принятие для защиты персональных данных от неправомерного или случайного доступа к ним, уничтожения, изменения, блокирования, копирования, предоставления, распространения персональных данных, а также от иных неправомерных действий в отношении персональных данных.
Таблица без правил доступа — это отсутствие технической меры от неправомерного доступа. Кроме того, Supabase и Firebase по умолчанию размещают базы за рубежом. Если в такую базу первыми записываются данные граждан России, нарушена ещё и локализация (глава 3.4), а это отдельный штраф до 6 млн ₽.
§3Открытая база — это уже утечка
Обязанность уведомить Роскомнадзор возникает не только при краже базы. Закон перечисляет передачу, предоставление, распространение и доступ.
152-ФЗ «О персональных данных»ст. 21, ч. 3.1ред. от 26.07.20263.1. В случае установления факта неправомерной или случайной передачи (предоставления, распространения, доступа) персональных данных, повлекшей нарушение прав субъектов персональных данных, оператор обязан с момента выявления такого инцидента оператором, уполномоченным органом по защите прав субъектов персональных данных или иным заинтересованным лицом уведомить уполномоченный орган по защите прав субъектов персональных данных:
1) в течение двадцати четырех часов о произошедшем инциденте […];
2) в течение семидесяти двух часов о результатах внутреннего расследования выявленного инцидента […].
Когда открытую таблицу находит исследователь, журналист или пользователь, для оператора начинается отсчёт 24 часов. Чтобы понять, был ли посторонний доступ, смотрят журналы запросов к базе: в Supabase они есть в разделе Logs. Если в журналах видны запросы к таблице с чужих адресов или журналы не сохранились, исходят из того, что доступ был.
- Ст. 19 не выполнена, но данные никто не получил
- Риск — при проверке или по жалобе
- Нужно исправить и задокументировать
- Уведомление за 24 и 72 часа
- Штраф по объёму: ч. 12–14 ст. 13.11
- За молчание — ещё ч. 11
- Против того, кто выгрузил: ст. 272.1 УК
- Против оператора — административное
- Пострадавшие могут требовать компенсацию
ч. 13 (до 100 тыс. субъектов) — организации 5–10 млн ₽; ч. 14 (больше 100 тыс.) — 10–15 млн ₽. Неуведомление (ч. 11) — ещё 1–3 млн ₽. Повторная утечка — 1–3 % выручки (глава 3.5).
Для небольшого проекта с базой меньше тысячи человек части 12–14 не применяются, но остаются обязанность уведомить и штраф за неуведомление по ч. 11. Посторонний, который сознательно выгрузил открытую таблицу с персональными данными, отвечает сам: использование и хранение незаконно полученных данных — ст. 272.1 УК. То, что таблица была открыта, не делает выгрузку законной.
§4Разбор: таблица учеников без RLS
students, RLS выключенЧерез месяц исследователь пишет на почту платформы: таблица с 4 200 заявками (имя, телефон, почта, название курса) читается публичным ключом из кода страницы. В журналах Supabase — запросы к таблице с десятков адресов.
- Мера защиты от неправомерного доступа не принята — ст. 19
- Посторонний доступ был — инцидент по ч. 3.1 ст. 21, 4 200 субъектов и 12 600 идентификаторов подпадают под ч. 12 ст. 13.11
- База за рубежом до записи в России — ч. 5 ст. 18, если так устроен сбор
- Организации — от 3 до 5 млн ₽ по ч. 12
- Если не уведомить Роскомнадзор за 24 часа — ещё 1–3 млн ₽ по ч. 11
- Локализация — 1–6 млн ₽ по ч. 8
Включить RLS и сменить ключи в тот же час; сохранить журналы; подать уведомление на pd.rkn.gov.ru в течение 24 часов, результаты расследования — в течение 72; ответить исследователю и поблагодарить; перенести базу в Россию.
§5Проверка перед запуском
Три проверки занимают несколько минут и закрывают большую часть типовых дыр. Их запускают до первого пользователя и после каждой крупной генерации кода.
select tablename from pg_tables where schemaname = 'public' and rowsecurity = false;
Запрос выполняется в SQL-редакторе Supabase. Каждая таблица в ответе читается публичным ключом. Для неё включают RLS и пишут политику: например, ученик видит только свои заявки, а школа — заявки на свои курсы.
curl "https://PROJECT.supabase.co/rest/v1/students?select=*&limit=1" \ -H "apikey: ПУБЛИЧНЫЙ_КЛЮЧ"
Ответ [] или ошибка доступа означает, что таблица закрыта. Если в ответе строка с данными — её увидит любой. Запрос отправляют только к своему проекту: проверка чужой базы без разрешения владельца — неправомерный доступ (глава 9.1).
gitleaks detect --source . --log-opts="--all" grep -rnE "service_role|sk-[A-Za-z0-9]{20,}|BEGIN PRIVATE KEY" dist/ build/ .next/ 2>/dev/null
Первая команда ищет ключи во всей истории коммитов: удалить файл в новом коммите недостаточно, ключ остаётся в истории. Найденный ключ считают скомпрометированным и выпускают новый у поставщика. Вторая команда проверяет собранные файлы сайта, которые получает браузер: служебного ключа в них быть не должно.
§6Частые ошибки
§7Проверьте себя
- Почему публичный ключ Supabase в коде страницы не является уязвимостью сам по себе? Что делает его опасным?
- Кто оператор персональных данных в проекте, код которого написала нейросеть? Какая статья обязывает его защищать данные?
- Какие действия перечислены в ч. 3.1 ст. 21 закона 152-ФЗ? Нужна ли кража базы, чтобы возникла обязанность уведомить Роскомнадзор?
- С какого момента идут 24 часа, если открытую таблицу нашёл посторонний исследователь?
- Почему после удаления файла с ключами из репозитория ключи всё равно меняют?
RLS выключенallow read, write: if trueservice_role в браузере.env в GitHubоператор — проектст. 19 — меры защитыст. 21 ч. 3.1 — доступ = инцидент24 ч и 72 чч. 12 — 3–5 млнч. 13 — 5–10 млнч. 14 — 10–15 млнч. 11 — 1–3 млн за молчаниеСправочник «Вайбкодинг в России» · модуль 10 · глава 10.1Макаров Максим Николаевич