Секреты
токены не в коде, не в git и не в чате
Что это
Секрет — то, что даёт доступ: токен бота, ключ API, пароль от базы. Утечка стоит денег и данных, а восстановить её нельзя: опубликованный токен считается скомпрометированным навсегда, его можно только отозвать.
Три места, куда секреты попадают чаще всего: код, git и чат с ИИ. Все три закрываются одним приёмом.
Как выглядит в коде
Нельзя
BOT_TOKEN = "7123456789:AAE-abcdefghijklmnop"Попадёт в git и останется в истории навсегда — даже если потом удалить строку. История хранит все версии.
Можно
Секреты лежат в файле .env, которого нет в репозитории:
BOT_TOKEN=7123456789:AAE-abcdefghijklmnop
DB_PATH=data/bot.dbКод читает их из окружения:
import os
def require(name: str) -> str:
value = os.environ.get(name)
if not value:
raise RuntimeError(f"не задана переменная окружения {name}")
return value
BOT_TOKEN = require("BOT_TOKEN")
DB_PATH = os.environ.get("DB_PATH", "bot.db")Запуск без переменной падает сразу и понятно:
RuntimeError: не задана переменная окружения BOT_TOKENЭто важнее, чем кажется. Без функции require отсутствующий токен дал бы
None, программа дошла бы до запроса к API и упала там — далеко от причины.
Обязательная строка
.envв .gitignore. Проверить, что сработало:
git status --shortЕсли .env в выводе есть — он ещё не игнорируется, и следующий git add -A
отправит его в репозиторий.
Разница между .env и .env.example
В репозиторий кладут пример без значений:
BOT_TOKEN=
DB_PATH=data/bot.dbОн показывает, какие переменные нужны, и ничего не раскрывает.
Секреты и ИИ
Отдельный случай, про который редко думают.
Не вставляй в чат файлы с секретами. Не .env, не конфиг с паролями, не
лог, в котором может быть токен (статья 4.2).
Перед отправкой кода просмотри его глазами. Особенно если копируешь целый файл: токен в двадцатой строке легко не заметить.
При работе агента в терминале он читает файлы сам — включая .env, если
не сказать иначе:
Файл .env не читай и в ответы его содержимое не включай.
Если нужны имена переменных — возьми их из .env.example.Такая просьба помогает, но это просьба, а не замок: агент может её забыть к концу длинной сессии или прочитать файл через команду. Надёжнее закрыть доступ в настройках самого инструмента — у агентов есть списки запрещённых файлов и разрешённых команд. А настоящие боевые ключи вообще не держи в папке, где работает агент: там хватит тестового токена.
Если секрет уже отправлен — отзови его. Это пять минут, и это единственное действие, которое действительно решает проблему.
Как сказать ИИ
Токен должен браться из переменной окружения BOT_TOKEN.
В коде его быть не должно. Если переменная не задана —
падать при старте с понятным сообщением.Проверь этот файл: есть ли в нём что-то, что нельзя
коммитить в публичный репозиторий?На что смотреть
Токен в примере кода. ИИ часто пишет TOKEN = "your-token-here" — это
нормально, но строку легко забыть заменить на чтение из окружения.
.env без .gitignore. Первое, что стоит проверить в новом проекте.
Секрет в сообщении об ошибке. raise ValueError(f"не подошёл ключ {key}")
— и ключ в логах.
Секрет в скриншоте. Терминал с переменными окружения, отправленный в чат для «посмотри на ошибку».
База данных в репозитории. *.db в .gitignore — там обычно данные
пользователей.
Шпаргалка
Секреты только из переменных окружения, в коде их нет.
.env— в.gitignore,.env.exampleбез значений — в репозиторий.Нет переменной — падать при старте с понятным сообщением.
Попал в git — удалить строку мало, отзывай токен.
В чат не вставляй
.env, конфиги и логи не глядя.Агенту скажи прямо:
.envне читать, а надёжнее — запрети в настройках инструмента.