Безопасность
Какие расширения файлов опасно открывать
Двойные расширения, маскировка под документ и другие приёмы, которыми вредоносные файлы прикидываются безобидными.
Клонировали чужой проект, а он не запускается без таинственного .env? Или настраиваете своё приложение и видите в инструкции «добавьте переменные в .env»? ENV-файл — один из самых частых файлов в разработке, и при этом один из тех, с которыми проще всего случайно слить пароли и API-ключи в открытый доступ. Разбираем формат, правила оформления и то, как не допустить утечку.
Коротко: .env — текстовый файл формата «ключ=значение» для хранения паролей, API-ключей и настроек приложения отдельно от кода. Открывается любым текстовым редактором, но никогда не должен попадать в Git или публичный доступ — иначе секреты проекта утекут вместе с ним.

.env (environment file) — это обычный текстовый файл без расширения в привычном смысле: имя файла целиком состоит из точки и буквы «env», а не из имени и расширения через точку. Внутри — построчные пары КЛЮЧ=значение: имя переменной окружения и её значение, без пробелов вокруг знака =.
# пример содержимого .env
DB_HOST=localhost
DB_PASSWORD=Secr3tPass!
API_KEY=sk_live_51Hx9k2
DEBUG=trueТакие пары называют переменными окружения (environment variables) — значениями, которые существуют не в самом коде программы, а «вокруг» неё, в окружении, где код запускается. Файл .env — это просто удобный способ собрать такие переменные в одном месте и загрузить их при старте приложения, вместо того чтобы прописывать каждую вручную в терминале.
Открыть и отредактировать .env можно любым текстовым редактором или IDE — «Блокнотом», VS Code, Sublime Text. Специальной программы не требуется: это такой же текстовый файл, как .txt, только с устоявшимся форматом записи и именем.
Формально — ничем: это такой же текстовый файл, как config.txt или settings.ini. Разница в соглашении (конвенции), а не в технологии. Название .env и формат КЛЮЧ=значение стали негласным стандартом экосистемы разработки — библиотеки вроде dotenv ожидают именно такое имя файла и именно такой формат по умолчанию, поэтому с ним совместимы практически любые фреймворки и языки без дополнительной настройки. А главное смысловое отличие — именно в .env принято класть секреты (пароли, ключи, токены), которые не должны попадать в систему контроля версий, в отличие от обычных конфигов, которые нередко коммитят вместе с кодом.
Три практические причины, из-за которых .env-файл стал стандартом в разработке, а не просто удобной привычкой.
Отделение секретов от кода. Методология Twelve-Factor App, которая описывает признанные практики разработки современных приложений, формулирует это как отдельный принцип: конфигурация должна храниться в окружении, а не внутри кода программы. Если пароль от базы данных «зашит» прямо в файле на Python или JavaScript, его сложно сменить без правки и повторного деплоя кода, а главное — он автоматически попадает в любое место, куда копируется этот код, включая публичный репозиторий.
Разные окружения — разные значения. У одного и того же проекта обычно есть несколько окружений: разработка (development) на компьютере программиста, тестовое (staging) для проверки перед релизом и боевое (production) для реальных пользователей. В каждом окружении — свой адрес базы данных, свои ключи внешних сервисов, свой режим отладки. Свой файл .env под каждое окружение позволяет переключаться между ними без единой правки кода приложения.
Удобство переноса и развёртывания проекта. Когда новый разработчик клонирует проект, ему не нужно разбираться, какие переменные и где прописаны внутри кода — достаточно заполнить свой .env по образцу и запустить приложение. Это ускоряет онбординг и снижает риск забыть настроить что-то важное.
Создание .env — вопрос пары минут, но у формата есть нюансы записи значений, из-за которых переменные иногда «не читаются» приложением.
.env — с точкой в начале и без ничего после «env».DB_HOST, а не db host): так переменные легко отличить от обычного кода в месте использования.PORT=3000, а не PORT = 3000: лишние пробелы некоторые библиотеки включают в значение переменной как часть текста, и сравнение значения потом не срабатывает.Разные типы значений в .env записываются по-разному — хотя файл всегда остаётся обычным текстом, и любое значение технически хранится как строка.
| Тип значения | Пример записи | Подводный камень |
|---|---|---|
| Обычная строка без пробелов | APP_ENV=production | Кавычки не нужны, но и не мешают |
| Строка с пробелами | APP_NAME="My Cool App" | Без кавычек значение обрежется на первом пробеле |
| Многострочное значение (например, приватный ключ) | PRIVATE_KEY="-----BEGIN KEY-----\nMIIЕ...\n-----END KEY-----" | Переносы строк нужно экранировать как \n внутри кавычек, иначе файл «ломается» на середине значения |
| Булево значение (да/нет) | DEBUG=true | Это строка "true", а не тип boolean — в коде её часто нужно явно сравнивать со строкой или приводить к булеву типу |
| Число | PORT=3000 | Тоже читается как строка — для математических операций число нужно явно преобразовать в коде |
Если после редактирования в .env вместо кириллицы или спецсимволов появляются «кракозябры» — дело в кодировке файла. Причины и починка разобраны в гайде почему текстовый файл показывает кракозябры.
Сам по себе .env-файл ничего не делает — приложение не читает его автоматически, если явно не добавлена соответствующая логика. На практике это почти всегда делает готовая библиотека: она открывает файл .env при старте программы, разбирает его построчно и помещает каждую пару «ключ-значение» в системное окружение процесса, откуда код затем читает переменные обычным способом (например, через process.env в Node.js или os.environ в Python).
Самая известная такая библиотека для JavaScript/Node.js — dotenv, её название и стало неофициальным синонимом самого подхода. У большинства популярных языков и фреймворков есть аналог с похожим принципом работы: библиотека подключается одной строкой в начале кода, после чего значения из .env становятся доступны как обычные переменные окружения — без изменений в остальной части программы.
Чтобы новый разработчик знал, какие переменные нужны проекту, в репозиторий кладут файл .env.example — тот же список ключей, но с пустыми или фиктивными значениями вместо реальных секретов. Это частный случай более общего приёма — заготовок проекта, подробнее о которых в материале шаблоны кода и boilerplate.
Главная угроза для .env — не сам формат файла, а то, что его легко случайно закоммитить в систему контроля версий вместе с остальным кодом проекта.

.env в файл .gitignore — строку с именем файла, которая запрещает Git отслеживать и коммитить его. Сделать это нужно ДО первого коммита проекта, а не после..env.example с настоящими значениями — только названия переменных и пустые или заведомо фиктивные значения-заглушки.Если .env с реальными паролями и ключами однажды попал в публичный Git-репозиторий (например, на GitHub), боты сканируют новые публичные коммиты на наличие похожих на секреты строк за считаные минуты. По рекомендации OWASP Secrets Management Cheat Sheet, в такой ситуации недостаточно просто удалить файл новым коммитом — он останется в истории Git. Единственное надёжное решение — немедленно сменить (ротировать) все скомпрометированные пароли и ключи, а уже потом вычищать историю репозитория.
Это же касается ситуации, когда проект просто скопировали архивом и переслали коллеге или заказчику: если .env оказался внутри архива со всеми остальными файлами, секреты ушли вместе с ним, даже если переписка была приватной.
Локальный .env на компьютере разработчика и секреты на боевом сервере — не всегда одно и то же, и для продакшена файл .env подходит не лучшим образом.
На многих хостингах и в CI/CD-системах секреты принято задавать не файлом, а напрямую как переменные окружения операционной системы или платформы — через панель управления хостинга, настройки CI/CD-пайплайна или команды запуска контейнера. Разница на первый взгляд незаметна: код приложения точно так же читает значение из окружения процесса, не зная, пришло оно из файла .env или было установлено платформой напрямую. Но у переменных платформы есть практическое преимущество — они не лежат статическим файлом на диске сервера, который теоретически можно случайно прочитать, скопировать с бэкапом или выгрузить при ошибке конфигурации веб-сервера.
Поэтому на практике нередко встречается такая схема: для локальной разработки используется файл .env (удобно редактировать и не нужен доступ к продакшну), а на проде те же переменные задаются средствами хостинга или CI/CD — то есть принцип (хранить конфигурацию в окружении) один и тот же, а конкретный механизм передачи для dev и для prod может различаться.
Для базовой работы с .env не нужно ничего, кроме текстового редактора, но несколько категорий инструментов упрощают жизнь на проектах покрупнее.
= или незакрытую кавычку) ещё до запуска приложения.Без ведущей точки большинство библиотек просто не найдёт файл по умолчанию — они ищут именно .env, а не env или env.txt. Проверьте показ скрытых файлов в проводнике — на Windows файлы с точкой в начале имени иногда визуально теряются среди обычных.
Запись вида PORT = 3000 вместо PORT=3000 в части библиотек приводит к тому, что пробел становится частью значения переменной — и сравнение значения с ожидаемым в коде неожиданно не срабатывает.
Частая причина — библиотека загрузки .env подключена в коде позже того места, где переменная уже используется, либо приложение было запущено до того, как .env был создан или сохранён. Проверьте порядок подключения и перезапустите процесс после правки файла — на лету .env обычно не перечитывается.
Если один и тот же ключ указан в файле дважды, библиотека обычно использует либо первое, либо последнее встреченное значение (поведение зависит от конкретной реализации) — это источник трудноуловимых багов, когда код как будто читает «не то» значение.
Если копировать проект простым архивированием папки (ZIP), .env попадает в архив вместе со всем остальным, если явно не исключён. При передаче проекта третьим лицам стоит удалить .env из архива и передать его отдельно или заново настроить переменные на стороне получателя.
Это текстовый файл, в котором разработчики хранят пароли, ключи и настройки приложения отдельно от основного кода — построчно, в формате «имя переменной = значение».
Любым текстовым редактором: «Блокнотом», VS Code, Sublime Text, Notepad++. Специального приложения не требуется — это обычный текстовый файл с особым форматом содержимого.
Файл с реальными значениями — нет, его нужно добавить в .gitignore. В репозиторий можно и стоит класть только .env.example — тот же список переменных, но с пустыми или фиктивными значениями.
Считать все значения из него скомпрометированными и немедленно сменить (ротировать) все пароли, ключи и токены — удаление файла новым коммитом эту проблему не решает, потому что он остаётся в истории Git.
Суть одна и та же — хранить конфигурацию вне кода, но .env — это файл на диске, а переменные окружения хостинга или CI/CD задаются через платформу и не лежат статическим файлом, который можно случайно прочитать или скопировать вместе с бэкапом.
Чаще всего — из-за пробелов вокруг знака «=», отсутствующих кавычек у значения с пробелом, неверного порядка подключения библиотеки загрузки .env в коде или того, что процесс не был перезапущен после изменения файла.
Да: строки с пробелами лучше брать в кавычки, а переносы строк внутри одного значения (например, в приватном ключе) экранировать как \n — иначе файл может быть прочитан некорректно или не до конца.