Программирование с ИИ
ENRU
5.7

Секреты

токены не в коде, не в 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 не читать, а надёжнее — запрети в настройках инструмента.