~/VibeHandbook
PDF бесплатно

Глава 18 · 03

Секреты и API-ключи: ловушка открытого ключа

Секрет — это всё, что даёт доступ: ключи (Application Programming Interface), пароли от базы, токены платёжных провайдеров, ключи подписи. Самая частая — и самая дорогая — ошибка vibe coding заключается в том, чтобы один из них утёк.

Две ловушки ловят людей постоянно:

  • Секреты в клиентском коде. Всё, что находится в вашем фронтенде (JavaScript, который выполняется в браузере), — публично. Пользователи могут открыть dev tools и прочитать это. AI, которого попросили вызвать API из React-компонента, с радостью вставит ваш секретный ключ прямо туда — и теперь любой, кто зайдёт на ваш сайт, может его скопировать и накрутить вам счёт. Секретным ключам место на сервере, а не в коде, который уходит в браузер.
  • Секреты в репозитории. Ключ, захардкоженный в файле, попадает в коммит . Даже если вы потом его удалите, он навсегда останется в истории git, а боты сканируют публичные репозитории ровно на это в течение нескольких минут после push.

Правильный дом для секрета — это переменная окружения (env): значение, которое подаётся приложению во время выполнения и полностью держится вне кода:

// VULNERABLE: ключ в исходниках, попадёт в коммит git
const stripe = new Stripe("sk_live_51H8xQ2eZvK...");

// SAFE: ключ читается из окружения, никогда не пишется в коде
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);

У секрета ровно один безопасный дом — на стороне сервера, прочитанный из окружения. Браузер — это публичное место: всё, что отправлено туда, может прочитать любой, кто откроет dev-инструменты.

            ┌──────────────────────────────────────────┐
            │  .env  (в gitignore, не коммитить)        │
            │  STRIPE_SECRET_KEY=sk_live_...            │
            └───────────────────┬──────────────────────┘
                                 │ внедряется в старт
                                ▼
   ┌──────────────────────┐          ┌──────────────────────┐
   │   SERVER             │          │   BROWSER (клиент)    │
   │   process.env.KEY ✓  │   ✗──────│   доступно всем       │
   │   вызов Stripe тут   │  НИКОГДА │   dev tools · "view   │
   │                      │  не шли  │   source" · network   │
   └──────────────────────┘  сюда    └──────────────────────┘
        безопасно: приватно           публично: = утечка 

Добавьте .env.env.local, и т. д.) в свой .gitignore до того, как напишете хоть один секрет. Если ключ всё-таки попал в код или историю, считайте его сгоревшим: ротируйте его (сгенерируйте новый и отзовите старый) — удалить строку недостаточно, потому что старый ключ всё ещё действителен и всё ещё гуляет где-то снаружи.

Хотите офлайн-версию?

Скачайте всю книгу в PDF или EPUB — бесплатно.