Утёк API-ключ — что делать по шагам
Ключ утёк — счёт растёт. Первые действия занимают минуту, и порядок в них важнее скорости.
2 мин · · Обновлено · безопасность · api-ключи · разработка
Ключ в публичном репозитории находят автоматические сканеры, и обычно быстрее, чем это замечаете вы. Порядок действий важнее скорости: если начать не с того, ущерб продолжит расти, пока вы наводите порядок.
Первое: отзовите ключ
Не меняйте его, не переносите в другое место, не начинайте чистить историю git. Сначала отзовите — это отключает ключ мгновенно и навсегда, и с этого момента ущерб перестаёт расти.
Всё остальное можно делать спокойно.
Частая ошибка — сначала выпустить новый ключ, потом переключить на него сервисы, а старый отозвать «когда всё заработает». В этом промежутке старый ключ продолжает работать у того, кто его нашёл.
Второе: посмотрите, что успели потратить
Откройте историю расходов и сравните с обычной картиной. Смотрите на три вещи: всплеск числа запросов, незнакомые модели и активность в часы, когда вы не работаете.
Если всплеска нет, вам повезло — успели раньше сканеров. Если есть, зафиксируйте объём: он понадобится, если будете обращаться в поддержку.
Третье: выпустите новый и разложите правильно
Новый ключ не должен попасть туда же, откуда утёк старый. Практический минимум:
Ключ живёт в переменных окружения или в менеджере секретов, а не в коде и не в конфиге, который лежит в репозитории.
В .gitignore попадают .env, .env.local и всё, что содержит секреты. Проверьте, что файл уже там, до первого коммита, а не после.
Для каждого сервиса — свой ключ. Утечка одного тогда не требует перевыпуска всех остальных. Учтите только, что история расходов (/v1/usage) общая на аккаунт и фильтра по ключу в ней нет; чтобы видеть расход по каждому ключу, логируйте у себя заголовок X-Zukko-Cost-Micros (он есть у нестриминговых ответов) или задайте ключам дневной и месячный лимит в кабинете.
Про чистку истории git
Удалить файл новым коммитом недостаточно: старое содержимое остаётся в истории и доступно любому, кто склонирует репозиторий. Переписать историю можно, но это ломает работу всем, у кого есть локальные копии.
Главное понимать: чистка истории не отменяет утечки. Ключ уже видели, он уже мог быть скопирован. Отзыв — обязателен, чистка истории — гигиена после.
Как не попадать в это
Ключ в скриншоте — второй по частоте способ после git. Прежде чем отправлять снимок терминала в чат или на форум, посмотрите, не видно ли в нём переменных окружения.
Ключ в логах — третий. Если пишете отладочный вывод с заголовками запроса, убедитесь, что Authorization в него не попадает.
И заведите привычку периодически смотреть список активных ключей: те, что вы не можете уверенно связать с конкретным сервисом, лучше отозвать.
zukko
Платите в 25×
меньше
за Claude Code & ChatGPT
Один ключ fetch_* и base URL api.zukko.pro — в Cursor, Claude Code, Codex и любом SDK.
Похожие статьи
- Свой прокси к нейросети на Node.js: не показывать API-ключ во фронтендеНебольшой сервер на Express между вашим фронтендом и API нейросети: ключ остаётся на сервере, а модели, длина запроса и частота ограничены.
- DeepSeek API на Python: запросы, стриминг, JSON и обработка ошибокГотовый код для DeepSeek V4.1 Flash и V4 Pro на OpenAI SDK: запрос, стриминг, разбор JSON и аккуратная обработка ошибок.
- Gemini API на Python: запросы через OpenAI SDK и OpenAI-форматРабочий пример Gemini API на Python без отдельной библиотеки: меняем base_url в OpenAI SDK, добавляем стриминг и JSON и сравниваем с google-genai.
- Anthropic SDK для Python: base_url, ключ и первый запрос через шлюзОфициальный пакет anthropic для Python нужно только направить на другой адрес. Разбираем base_url, ключ, стриминг, подсчёт токенов, кэш и ошибки.