Утёк API-ключ OpenAI или Supabase: что делать
Утёкший ключ нужно сразу отозвать и выпустить новый: удаление из кода не помогает, ключ остаётся в истории git и в уже скачанных копиях. Затем проверьте расходы и логи, перенесите вызовы платных API на сервер и настройте, чтобы секреты больше не попадали в репозиторий и в браузер.
Первая помощь и как чиним
- 1Отозвать ключ
Удаляем скомпрометированный ключ в панели сервиса и выпускаем новый, кладём его только на сервер.
- 2Оценить ущерб
Смотрим расходы и логи использования за период утечки, ставим лимиты трат.
- 3Убрать ключи из клиента
Переносим вызовы OpenAI и секретные запросы на сервер или в edge-функцию.
- 4Почистить историю
Решаем, нужна ли чистка истории git; если репозиторий был публичным, считаем ключ раскрытым в любом случае.
- 5Поставить защиту
Сканирование секретов перед коммитом, .gitignore для .env, лимиты на эндпоинты с ИИ.
Чинить самому или отдать в «аптечку»
Мы уже наступили на эти грабли — вам не придётся
Аптечка: что с проектом?
3 вопроса — и мы скажем, сколько стоит починка. Чек-лист безопасности проекта в подарок.
Интервью с собственником и РОПом, аудит текущей CRM и источников заявок.
1–3 дняВоронки, роли, точки контроля. Согласуем до того, как что-то настраивать.
3–5 днейНастраиваем Битрикс24 и дописываем недостающие инструменты. Демо каждую неделю.
1–4 неделиОбучение, база знаний, поддержка. Дорабатываем, пока цифры не поедут вверх.
дальше — с вамиПодробнееразвёрнутое описание, этапы и нюансы
ИИ-инструменты часто вставляют ключ прямо в код: так быстрее заработало демо. Потом проект уходит в публичный GitHub или на хостинг, и ключ видит каждый, кто откроет исходник страницы. Хорошая новость: последствия почти всегда можно остановить за несколько минут, если действовать в правильном порядке.
Почему так происходит
- Вызов OpenAI из браузера. Если запрос к API идёт прямо со страницы, ключ обязательно лежит в JavaScript, который скачивает посетитель. Префиксы
VITE_иNEXT_PUBLIC_вшивают значение в сборку. - Секреты в репозитории.
.envне добавлен в.gitignore, или ключ вписан строкой в конфиг. - Путаница ключей Supabase. У Supabase есть публичный ключ (anon или новый publishable) и секретный (service_role или новый
sb_secret_...). Секретный обходит RLS и даёт полный доступ к базе. ИИ иногда подставляет его во фронтенд, «чтобы заработало».
Что проверить самому
- Отзовите ключ прямо сейчас. OpenAI: platform.openai.com → API keys → удалить ключ, создать новый. Поставьте лимит расходов в разделе Limits.
- Supabase. Если вы перешли на новые ключи, секретный
sb_secret_...можно удалить и создать заново в Settings → API Keys. Утечка legacy-ключа service_role лечится сложнее: он подписан JWT-секретом, и его смена перевыпускает и публичный ключ, поэтому планируйте обновление клиента. - Посмотрите Usage и логи за период утечки: всплески запросов, незнакомые модели, ночная активность.
- Найдите, где ещё живёт ключ:
git log -p -S "sk-" --all
grep -rn "service_role\|sb_secret_\|sk-" src/ dist/ .next/ 2>/dev/null
- Проверьте, что
.envв.gitignoreи его нет ни в одном коммите. - Если ключ был в публичном репозитории, считайте его раскрытым даже после чистки истории.
Подробнее о хранении секретов — правило 5 в статье «Почему вайб-код ломается».
Когда звать разработчика. Отозвать ключ нужно самому и сразу, не дожидаясь никого. Дальше помощь пригодится, если ключ используется в нескольких местах и после замены что-то перестало работать, если утёк секретный ключ Supabase, если в логах видны чужие запросы к вашей базе или если нужно переносить вызовы ИИ из браузера на сервер. Утечка — повод проверить проект целиком: где был один ключ, часто найдутся и другие.
Как чиним мы
Если утечка свежая, помогаем отозвать ключи сразу, не дожидаясь договора. Затем проводим аудит: где ещё есть секреты, какие запросы идут из браузера, включён ли RLS. Переносим вызовы платных API на сервер или в edge-функцию с проверкой пользователя и ограничением частоты запросов, чтобы чужой скрипт не сжёг ваш бюджет. Настраиваем сканирование секретов перед коммитом и при необходимости чистим историю git. Подробности — на странице «Аптечка вайб-кода».
Сколько стоит
Диагностика — 50 000 ₸, аудит безопасности и вынос ключей — 60 000 ₸, итого от 110 000 ₸ для небольшого проекта. Если нужно переписать часть логики на сервер, добавляется доработка. Посчитать можно в калькуляторе.
Частые вопросы
Ключ был в репозитории всего час. Это опасно?
Да. Публичные репозитории сканируют боты, ключи находят за минуты. Отзывайте ключ в любом случае.
Anon-ключ Supabase виден в браузере — это утечка?
Нет, публичный ключ (anon или publishable) задуман для браузера. Он безопасен, только если на всех таблицах включён RLS с правильными политиками. Секретный ключ service_role или sb_secret в браузере — это утечка.
Достаточно ли удалить ключ из файла и сделать коммит?
Нет. Старый коммит с ключом остаётся в истории и в копиях репозитория. Ключ нужно отозвать в панели сервиса.
Сделаем так же у вас
Короткий созвон — и вы знаете срок и цену. Или посчитайте сами за 2 минуты.