Типичная история: ты опубликовал «Змейку» на GitHub Pages, подключил таблицу рекордов в Supabase и гордишься результатом. Через пару часов приходит письмо: «Мы обнаружили ваш API-ключ в публичном репозитории». Или ещё хуже — в облачном кабинете появляются незнакомые запросы, а счёт за базу данных резко вырос. Такое случается, когда секретный токен случайно попадает в код, который виден всему интернету. Разберёмся, что такое токены и секреты, почему их нельзя отправлять в GitHub, как прятать их в файле .env и что делать, если ключ всё-таки утёк.
Содержание
Что такое токен и секрет
Токен — это длинная случайная строка, которая заменяет логин и пароль при обращении к сервису. Если пароль обычно нужен, чтобы войти в личный кабинет глазами человека, токен нужен программе — например, твоей игре — чтобы получить доступ к базе данных или облачному хранилищу.
Секрет — более широкое понятие. Это любая конфиденциальная информация, которую нельзя показывать посторонним: API-ключи, пароли от базы данных, токены доступа, приватные ключи шифрования.
Проще говоря, токен — как ключ от подъезда. Если его сфотографировать и выложить в соцсети, любой сможет зайти. В цифровом мире «подъезд» — это сервер Supabase, почтовый сервис или облачное хранилище.
Почему токены нельзя коммитить
Когда ты делаешь git commit и отправляешь код на GitHub, каждая строка сохраняется в истории. Если репозиторий публичный — его видит весь интернет, включая ботов, которые специально ищут случайно опубликованные ключи.
GitHub запускает автоматическое сканирование секретов в публичных репозиториях. Если система находит известный формат ключа — например, от Supabase, OpenAI, AWS или Slack — она может уведомить владельца и даже автоматически связаться с провайдером сервиса. Провайдер, в свою очередь, часто отключает ключ, чтобы злоумышленник не успел им воспользоваться.
Но боты работают быстрее. Исследования безопасности неоднократно показывали, что токены, опубликованные в открытом доступе, находят и пробуют использовать в течение минут. Злоумышленники могут:
- читать и изменять данные твоих пользователей;
- удалить базу данных или весь проект;
- рассылать спам через подключённый почтовый сервис;
- накрутить расходы на платных API вроде OpenAI или облачных хранилищ.
Даже если репозиторий приватный, коммитить ключи — плохая привычка. Когда-нибудь репозиторий могут случайно открыть, или к нему получит доступ другой человек, или ты скопируешь код в публичный пример. Правило простое: секреты не живут в коде.
Что такое .env и .gitignore
Файл .env — это обычный текстовый файл, в котором хранятся переменные окружения. Для программы это «настройки извне»: игра запускается, читает значения из .env и использует их, но сам файл не попадает в GitHub.
Пример файла .env для «Змейки» с Supabase:
SUPABASE_URL=https://abcdefgh12345678.supabase.co
SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
А в коде программа обращается к ним так:
const supabaseUrl = process.env.SUPABASE_URL;
const supabaseKey = process.env.SUPABASE_ANON_KEY;
Чтобы .env не улетел на GitHub, в той же папке создаётся файл .gitignore. Это список файлов и папок, которые Git должен игнорировать. Достаточно добавить туда одну строку:
.env
После этого Git перестаёт отслеживать .env, и при публикации репозитория он не попадёт ни в код, ни в историю коммитов.
Важно: .env хранится локально на твоём компьютере. Если ты работаешь на другой машине или коллега клонирует репозиторий, ему нужно создать свой .env вручную. Поэтому удобно держать в репозитории файл .env.example с пустыми или фиктивными значениями — чтобы было понятно, какие переменные нужны.
Как ИИ-ассистент прячет ключи
В курсе ты не пишешь код руками — ты даёшь задачу ИИ-ассистенту, а он генерирует файлы. Хороший промпт на подключение Supabase звучит примерно так: «Подключи Supabase к проекту, вынеси ключи в переменные окружения, добавь .env в .gitignore и объясни, какие значения мне вписать».
ИИ обычно делает следующее:
- Создаёт файл
.envи записывает туда ключи. - Правит код так, чтобы он читал ключи из переменных окружения.
- Добавляет
.envв.gitignore. - Создаёт
.env.exampleс названиями переменных, но без настоящих значений. - Проверяет, что
.envне попал в индекс Git.
Но ИИ не всесилен. Он действует по твоей задаче, поэтому важно самому проверять результат. Перед каждым коммитом смотри в Git-интерфейсе: не оказались ли в изменениях строки вроде api_key, token, password или длинные случайные наборы символов.
Никогда не копируй настоящие ключи в чат с ИИ. Если ассистент предлагает вставить токен — вставляй его только в локальный .env, а в промпте указывай: «используй переменную окружения, реальное значение не пиши».
Что делать, если токен утёк
Если ты обнаружил ключ в публичном репозитории, действуй быстро:
- Отзови или смени ключ. Зайди в кабинет сервиса — Supabase, OpenAI, GitHub или любого другого — и создай новый ключ, а старый отключи. Это главный шаг: после отзыва старый ключ становится бесполезным.
- Проверь журнал активности. В кабинете сервиса посмотри, не было ли подозрительных запросов в период между публикацией и отзывом.
- Удали ключ из кода. Удали строку с токеном из файлов проекта.
- Удали ключ из истории Git. Простое удаление из текущего файла не удаляет его из старых коммитов. Используй инструменты вроде
git filter-repoили обратись к документации GitHub по удалению конфиденциальных данных из истории. - Перепроверь
.gitignore. Убедись, что.envи другие файлы с секретами действительно игнорируются. - Замени ключ в локальном
.env. После генерации нового ключа вставь его в свой локальный файл.
Не пытайся просто «замазать» ключ новым коммитом. История Git хранит всё, и любой может открыть старый коммит и найти токен. Нужно либо переписать историю, либо — в крайнем случае — удалить репозиторий и создать новый.
Практический чек-лист
- Все ключи, токены и пароли вынесены в
.env. - Файл
.envдобавлен в.gitignore. - В репозитории есть
.env.exampleс названиями переменных, но без реальных значений. - Перед каждым коммитом проверяешь, что секреты не попали в изменения.
- Не копируешь настоящие токены в чаты с ИИ.
- Знаешь, где в кабинете сервиса отозвать ключ при утечке.
- Включено двухфакторное подтверждение в облачных сервисах.
Заключение
Секреты — это не просто «ещё одна строчка в коде». Это ключи от твоего проекта, данных и иногда денег. Правильное хранение токенов в .env и исключение этого файла из Git — базовая привычка, которая отделяет безопасное приложение от публичной катастрофы.
В контексте курса это особенно важно: в Модуле 3 ты публикуешь «Змейку» на GitHub Pages, а в Модуле 5 подключаешь Supabase для общей таблицы рекордов. Оба шага связаны с публичным кодом и облачными сервисами. Если сразу настроить .env и .gitignore, дальше можно сосредоточиться на игре, а не на устранении утечек.
Запомни: код на GitHub — как витрина магазина. Всё, что там лежит, видно миру. Секреты храни в задней комнате, в файле .env, который никогда не попадает на витрину.
Источники
- GitHub Docs — «Removing sensitive data from a repository»: docs.github.com
- Supabase Docs — «Environment Variables»: supabase.com/docs/guides/functions/secrets
- OWASP — «Secrets Management Cheat Sheet»: cheatsheetseries.owasp.org
Читай дальше
Все статьиНе просто статьи — тебя доведут до результата
В практикуме за 1999 ₽ рядом живая команда практикующих разработчиков и маркетологов: ведём по шагам до твоего работающего приложения. Не «ролики и сам разбирайся» — помогаем на каждом затыке.
Перейти к практикуму