Модуль 10 · Нейросеть в коде и в продукте

Справочник «Вайбкодинг в России» · модуль 10 · Нейросеть в коде и в продукте

Глава 10.1

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.2026
2) оператор - государственный орган, муниципальный орган, юридическое или физическое лицо, самостоятельно или совместно с другими лицами организующие и (или) осуществляющие обработку персональных данных, а также определяющие цели обработки персональных данных, состав персональных данных, подлежащих обработке, действия (операции), совершаемые с персональными данными;

Для «КурсБлиновской» оператором данных своих клиентов — школ и авторов — является ООО «КурсБлиновской», а данных учеников — школы, которые поручили платформе их хранить (глава 3.1). Обязанность защищать данные лежит на операторе и не зависит от того, кто написал код: работник, подрядчик или нейросеть.

152-ФЗ «О персональных данных»ст. 19, ч. 1ред. от 26.07.2026
1. Оператор при обработке персональных данных обязан принимать необходимые правовые, организационные и технические меры или обеспечивать их принятие для защиты персональных данных от неправомерного или случайного доступа к ним, уничтожения, изменения, блокирования, копирования, предоставления, распространения персональных данных, а также от иных неправомерных действий в отношении персональных данных.

Таблица без правил доступа — это отсутствие технической меры от неправомерного доступа. Кроме того, Supabase и Firebase по умолчанию размещают базы за рубежом. Если в такую базу первыми записываются данные граждан России, нарушена ещё и локализация (глава 3.4), а это отдельный штраф до 6 млн ₽.

§3Открытая база — это уже утечка

Обязанность уведомить Роскомнадзор возникает не только при краже базы. Закон перечисляет передачу, предоставление, распространение и доступ.

152-ФЗ «О персональных данных»ст. 21, ч. 3.1ред. от 26.07.2026
3.1. В случае установления факта неправомерной или случайной передачи (предоставления, распространения, доступа) персональных данных, повлекшей нарушение прав субъектов персональных данных, оператор обязан с момента выявления такого инцидента оператором, уполномоченным органом по защите прав субъектов персональных данных или иным заинтересованным лицом уведомить уполномоченный орган по защите прав субъектов персональных данных:
1) в течение двадцати четырех часов о произошедшем инциденте […];
2) в течение семидесяти двух часов о результатах внутреннего расследования выявленного инцидента […].

Когда открытую таблицу находит исследователь, журналист или пользователь, для оператора начинается отсчёт 24 часов. Чтобы понять, был ли посторонний доступ, смотрят журналы запросов к базе: в Supabase они есть в разделе Logs. Если в журналах видны запросы к таблице с чужих адресов или журналы не сохранились, исходят из того, что доступ был.

Закрыли до обращенийНарушение меры защиты
  • Ст. 19 не выполнена, но данные никто не получил
  • Риск — при проверке или по жалобе
  • Нужно исправить и задокументировать
Был посторонний доступУтечка
  • Уведомление за 24 и 72 часа
  • Штраф по объёму: ч. 12–14 ст. 13.11
  • За молчание — ещё ч. 11
Базу выгрузили и продаютУголовное дело
  • Против того, кто выгрузил: ст. 272.1 УК
  • Против оператора — административное
  • Пострадавшие могут требовать компенсацию
КоАП РФ ст. 13.11 ч. 12 — утечка данных от 1 000 до 10 000 субъектов или от 10 000 до 100 000 идентификаторов
Гражданин
от 100 тыс. до 200 тыс. ₽
Должностное лицо
от 200 тыс. до 400 тыс. ₽
Организация
от 3 млн до 5 млн ₽
1 тыс.10 тыс.100 тыс.1 млн10 млн100 млн

ч. 13 (до 100 тыс. субъектов) — организации 5–10 млн ₽; ч. 14 (больше 100 тыс.) — 10–15 млн ₽. Неуведомление (ч. 11) — ещё 1–3 млн ₽. Повторная утечка — 1–3 % выручки (глава 3.5).

Для небольшого проекта с базой меньше тысячи человек части 12–14 не применяются, но остаются обязанность уведомить и штраф за неуведомление по ч. 11. Посторонний, который сознательно выгрузил открытую таблицу с персональными данными, отвечает сам: использование и хранение незаконно полученных данных — ст. 272.1 УК. То, что таблица была открыта, не делает выгрузку законной.

§4Разбор: таблица учеников без RLS

СлучайОснователи «КурсБлиновской» попросили нейросеть сделать страницу записи на курс. Заявки пишутся в таблицу Supabase 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Проверка перед запуском

Три проверки занимают несколько минут и закрывают большую часть типовых дыр. Их запускают до первого пользователя и после каждой крупной генерации кода.

check_rls.sql · таблицы Supabase без защиты на уровне строк
select tablename
from pg_tables
where schemaname = 'public' and rowsecurity = false;

Запрос выполняется в SQL-редакторе Supabase. Каждая таблица в ответе читается публичным ключом. Для неё включают RLS и пишут политику: например, ученик видит только свои заявки, а школа — заявки на свои курсы.

anon_probe.sh · что видит посторонний с публичным ключом
curl "https://PROJECT.supabase.co/rest/v1/students?select=*&limit=1" \
  -H "apikey: ПУБЛИЧНЫЙ_КЛЮЧ"

Ответ [] или ошибка доступа означает, что таблица закрыта. Если в ответе строка с данными — её увидит любой. Запрос отправляют только к своему проекту: проверка чужой базы без разрешения владельца — неправомерный доступ (глава 9.1).

scan_secrets.sh · ключи в репозитории и в собранном сайте
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

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

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

§6Частые ошибки

«Ключ публичный, значит так и задумано»Публичный ключ безопасен только при включённых правилах доступа на каждой таблице.
Удалить .env новым коммитомФайл остаётся в истории репозитория и в форках. Ключи нужно выпустить заново.
Закрыть базу и никому не сообщатьЕсли в журналах есть посторонние запросы, это утечка: 24 часа на уведомление, за молчание — ч. 11 ст. 13.11.
Считать, что отвечает SupabaseСервис предоставляет инструмент; оператор и обязанность защищать данные — у проекта.
Проверить чужой проект «из интереса»Запрос к чужой базе без разрешения — ст. 272 УК, при персональных данных — ст. 272.1.

§7Проверьте себя

  1. Почему публичный ключ Supabase в коде страницы не является уязвимостью сам по себе? Что делает его опасным?
  2. Кто оператор персональных данных в проекте, код которого написала нейросеть? Какая статья обязывает его защищать данные?
  3. Какие действия перечислены в ч. 3.1 ст. 21 закона 152-ФЗ? Нужна ли кража базы, чтобы возникла обязанность уведомить Роскомнадзор?
  4. С какого момента идут 24 часа, если открытую таблицу нашёл посторонний исследователь?
  5. Почему после удаления файла с ключами из репозитория ключи всё равно меняют?
Дыры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Макаров Максим Николаевич

Кадр