Глоссарий

Что такое .env — что происходит при утечке файла окружения

.env хранит секреты приложения (доступ к БД, ключи API, ключи шифрования) в одном файле. Чем опасна его утечка, где его хранить и как защитить в git.

Опубликовано 2026-06-07 Обновлено 2026-10-06 7 мин чтения
На этой странице

.env крайне удобен, и почти каждый современный фреймворк его использует. Но положите его не туда хоть раз — и все секреты в нём сможет прочитать кто угодно. Разберём, что это и как его защитить, с нуля.

Чуть подробнее

У приложений есть «значения, меняющиеся от окружения к окружению» и «значения, которые никто не должен видеть»: пароль БД, внешние ключи API, ключ, шифрующий сеансы. Зашейте их в исходный код — и секреты утекут в тот момент, когда вы поделитесь кодом.

Поэтому вы собираете их в один файл .env и читаете из кода как «переменные окружения». Next.js, Laravel, Rails и многие фреймворки работают так.

Содержимое — обычный текст, по одной паре ИМЯ=значение в строке (значения ниже — заглушки).

APP_ENV=production
DB_HOST=127.0.0.1
DB_PASSWORD=your-db-password-here
PAYMENT_API_KEY=your-payment-api-key-here

Хранить конфигурацию вне кода популяризировало руководство по проектированию веб-приложений «The Twelve-Factor App». Его проверка того, правильно ли отделена конфигурация, — можно ли в любой момент сделать код открытым, не скомпрометировав ни одних учётных данных. .env — удобный контейнер для этой идеи при разработке.

Чем он отличается от похожих вещей

Вот что чаще всего путают с .env. Безопасным местом для секретов является лишь часть из них.

НазваниеЧто этоМожно ли хранить секреты?
Переменные окруженияЗначения, которые ОС или контейнер передаёт работающему процессуДа (норма в продакшене)
.envПеременные окружения, собранные в файлДа, но никогда в публичном каталоге или Git
.env.exampleОбразец со списком имён и пустыми значениямиНет (он предназначен для коммита)
NEXT_PUBLIC_* / VITE_*Переменные, встраиваемые в JavaScript для браузераНет (их может прочитать кто угодно)
Менеджер секретовОблачный сервис для хранения секретных значенийДа; управляется правами и журналами аудита

Четвёртую строку и упускают. Next.js при сборке встраивает значения переменных, начинающихся с NEXT_PUBLIC_, а Vite — с VITE_, в JavaScript, отправляемый в браузер. Даже если такая переменная лежит в .env, с одним из этих префиксов она становится публичной.

Почему это «самый опасный файл»

Поскольку несколько ключей лежат в одном файле, единственное раскрытие быстро разносит ущерб. Перечисление «что разблокирует каждое утёкшее значение» делает серьёзность наглядной.

Утёкшее значениеЧто происходит
Учётные данные БДчтение / изменение / стирание данных
Внешние ключи APIиспользование от чужого имени, мошеннические списания
Ключ шифрования (например, Laravel APP_KEY, ключи подписи)подделка сеанса, вход от чужого имени
Секреты OAuthзахват связанных приложений

И правда, раскрытие .env — классический инцидент. → .env, открытый всему миру

Реальные случаи: раскрытые .env становятся целью

  • Масштабная операция вымогательства (2024): исследовательская группа компании в области безопасности сообщила об активности, которая охватила 110 000 доменов, собирала раскрытые на веб-серверах файлы .env, использовала облачные учётные данные из них, чтобы забирать данные, и требовала выкуп. Было собрано более 90 000 переменных, около 7000 из них — для облачных сервисов и около 1500 — для аккаунтов в соцсетях. Причиной была не уязвимость облачного провайдера, а ошибки настройки у организаций, раскрывших свои .env
  • Vercel (апрель 2026 г.): несанкционированный доступ к внутренним системам привёл к тому, что были прочитаны переменные окружения части клиентов — хранившиеся в категории, значения которой можно отобразить повторно → подробный разбор (на английском)
  • Публичные репозитории (исследование 2026 г.): более 540 000 учётных данных, опубликованных на GitHub, на момент исследования всё ещё действовали. Удаление файла или истории не помогает, если учётные данные не отозваны → подробный разбор

Первый случай показывает, что раскрытые .env находят не люди, листающие сайты, — их собирают автоматически и массово. Не думайте, что небольшой сайт не найдут.

Типичная утечка = ошибка размещения

Главная причина — «класть всё приложение в публичную директорию (docroot)». Там, где обслуживаться должен только public/, раскрытие его родительской папки делает .env тоже достижимым.

✗ Опасно (приложение в публичном корне)

public_html/
├─ .env   ← читается!
├─ app/
└─ public/

✓ Безопасно (приложение снаружи, обслуживается только public)

app-root/
├─ .env   ← недостижим
├─ app/
└─ public_html/ → public/
Держите приложение вне docroot и обслуживайте только public/. Уже это делает .env недостижимым.

Помимо размещения, он утекает и такими путями:

  • Коммит в Git (в публичном репозитории — мгновенно публичен; в приватном — виден всем, у кого есть доступ)
  • Резервные копии вроде .env.bak или .env.old, оставленные в публичном каталоге
  • Образ контейнера или zip-дистрибутив, в котором остался .env
  • Секреты в переменных NEXT_PUBLIC_ / VITE_, как описано выше

Как его защитить

1

Не кладите его в публичную директорию

Держите приложение вне docroot; обслуживайте только public/. Конкретные шаги для шаред-хостинга: это руководство.

2

Не коммитьте его в git

Добавьте .env* в .gitignore и делитесь только .env.example с пустыми значениями.

3

Ротируйте всё, если он утёк

Не только подтверждённый ключ — замените каждый ключ, что был в .env. Действуйте так, будто видели все.

4

Регулярно делайте самопроверку

Выработайте привычку проверять, что /.env нельзя открыть на вашем собственном сайте.

Как проверить сайт и репозиторий

Самопроверка (только против доменов, которыми вы владеете)

# 200 с телом означает, что он раскрыт. 403/404 — пока в порядке.
curl -sI https://yourdomain/.env | head -1
curl -sI https://yourdomain/.git/config | head -1

Проверка этого при каждом деплое рано ловит ошибки размещения.

Проверяйте и снаружи сайта, и внутри репозитория.

  1. Для сайта, владение которым вы подтвердили, аудит безопасности сайта разом проверяет /.env, /.env.local, /.env.bak и похожие пути
  2. В репозитории выполните git log --all --oneline -- .env, чтобы увидеть, коммитился ли он когда-либо. Если что-то нашлось, отзовите ключи, которые в нём были
  3. Вставьте конфигурацию или код в сканер утечек секретов, чтобы найти зашитые ключи API или закрытые ключи (он работает в вашем браузере)
  4. Просмотрите список переменных NEXT_PUBLIC_ / VITE_, чтобы ни один секрет не попал в собранный JavaScript

Мнение этого сайта: решайте вместе, где лежит .env и как отзывать его ключи

Большинство инцидентов с .env начинается с одного файла не в том месте. А разрастается ущерб потом из-за того, что нет готовой процедуры замены ключей. На этом сайте мы рекомендуем: если вы используете .env, не только держите его вне публичного каталога и Git, но и заранее запишите, как отозвать и перевыпустить каждый ключ в нём. В продакшене переход на облачный менеджер секретов или на переменные окружения, значения которых нельзя отобразить повторно, ещё сильнее сокращает пути утечки.

Источники (первичные)

  • The Twelve-Factor App, «III. Config» — 12factor.net (хранить конфигурацию в переменных окружения; проверка «можно ли открыть код»)
  • Документация Next.js, «Environment Variables» — nextjs.org (NEXT_PUBLIC_ встраивается в JavaScript при сборке; не коммитить файлы .env)
  • Документация Vite, «Env Variables and Modes» — vite.dev (переменные VITE_ доступны клиентскому коду)
  • Unit 42 (Palo Alto Networks), «Leaked Environment Variables Allow Large-Scale Extortion Operation in Cloud Environments» (15 августа 2024 г.) — unit42.paloaltonetworks.com

Читать дальше

Классификация

CWE классифицирует типы слабостей, из-за которых возникают уязвимости; MITRE ATT&CK классифицирует техники атакующих. Обе системы ведёт MITRE, и они широко используются для разметки уязвимостей и правил обнаружения.

CWE™: Copyright © 2006–2026, The MITRE Corporation. CWE is a trademark of The MITRE Corporation. The MITRE Corporation hereby grants you a non-exclusive, royalty-free license to use CWE for research, development, and commercial purposes. Any copy you make for such purposes is authorized on the condition that you reproduce MITRE’s copyright designation and this license in any such copy. CWE Terms of Use

FAQ

QМожно ли коммитить .env в git?
A

Нет. Добавьте .env в .gitignore. Вместо этого закоммитьте .env.example с пустыми значениями, чтобы поделиться тем, какие ключи нужны.

QЕсли из .env утечёт хотя бы один секрет, что я ротирую?
A

Не только тот, который вы подтвердили, — ротируйте каждый ключ, что был в .env. Приоритет: внешние API / секреты OAuth → ключи шифрования → почта → БД. Действуйте так, будто видели все.

QКак проверить, не утёк ли .env?
A

Откройте https://yourdomain/.env в браузере. Если содержимое показывается — он раскрыт (200 с телом = плохо). Если он заблокирован (403/404), пока вы в порядке.

QЧто означает .env?
A

Обычно читается как «дот-энв». env — сокращение от environment (окружение), а точка в начале обозначает скрытый файл в Linux и macOS. Файл — это список строк вида ИМЯ=значение, например DB_PASSWORD=…, которые приложение загружает как переменные окружения.

QМожно ли хранить секреты в переменных, начинающихся с NEXT_PUBLIC_ или VITE_?
A

Нет. В Next.js (NEXT_PUBLIC_) и Vite (VITE_) значения переменных с этими префиксами при сборке встраиваются в JavaScript, отправляемый в браузер, где их может прочитать кто угодно. То, что они лежат в .env, не делает их секретными. Используйте ключи API только в серверном коде и не давайте им эти префиксы.

QЯ случайно запушил .env на GitHub. Что теперь?
A

Сначала отзовите и перевыпустите каждый ключ, который в нём был. Удаление файла или переписывание истории не отменит копий, которые уже могли появиться, поэтому отзыв идёт раньше удаления. Затем добавьте .env в .gitignore и удалите его из истории.