Glossário

O que é o .env — o que acontece quando um arquivo de ambiente vaza

O .env reúne credenciais de banco e chaves de API em um só arquivo. Por que o vazamento é tão grave e como protegê-lo no servidor, no git e com rotação.

Publicado 2026-06-07 Atualizado 2026-10-06 8 min de leitura
Nesta página

O .env é extremamente prático e quase todo framework moderno o usa. Mas coloque-o no lugar errado uma única vez e todos os segredos nele podem ser lidos por qualquer pessoa. Veja o que ele é e como protegê-lo, do zero.

Um pouco mais de detalhe

Os aplicativos têm "valores que mudam por ambiente" e "valores que você não quer que ninguém veja": a senha do banco, chaves de API externas, a chave que criptografa as sessões. Codifique-os direto no fonte e os segredos vazam no instante em que você compartilha o código.

Então você os reúne em um único arquivo .env e os lê como "variáveis de ambiente" a partir do código. Next.js, Laravel, Rails e muitos frameworks funcionam assim.

O conteúdo é texto puro, um NOME=valor por linha (os valores abaixo são apenas exemplos).

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

Manter a configuração fora do código foi popularizado pelo guia de design de aplicativos web "The Twelve-Factor App". O teste que ele propõe para saber se a configuração está bem separada é: o código poderia virar open source a qualquer momento sem comprometer nenhuma credencial? O .env é um recipiente conveniente para essa ideia durante o desenvolvimento.

Como ele se diferencia de coisas parecidas

Estas são as coisas mais confundidas com o .env. Só algumas delas são um lugar seguro para segredos.

NomeO que éServe para segredos?
Variáveis de ambienteValores que o SO ou o contêiner passa para um processo em execuçãoSim (o padrão em produção)
.envVariáveis de ambiente reunidas em um arquivoSim, mas nunca em diretório público nem no Git
.env.exampleUm exemplo que lista os nomes com valores vaziosNão (ele é feito para ser commitado)
NEXT_PUBLIC_* / VITE_*Variáveis embutidas no JavaScript do navegadorNão (qualquer pessoa pode lê-las)
Gerenciador de segredosUm serviço de nuvem para guardar valores secretosSim; gerenciado com permissões e logs de auditoria

A quarta linha é a que passa despercebida. O Next.js embute os valores das variáveis que começam com NEXT_PUBLIC_, e o Vite os das que começam com VITE_, no JavaScript enviado ao navegador no momento do build. Mesmo estando no .env, uma variável com um desses prefixos se torna pública.

Por que ele é o "arquivo mais perigoso"

Como várias chaves ficam em um único arquivo, uma única exposição espalha o dano rápido. Listar "o que cada valor vazado destrava" deixa a severidade clara.

Valor vazadoO que acontece
Credenciais do bancoler / alterar / apagar dados
Chaves de API externauso por personificação, cobrança fraudulenta
Chave de criptografia (por exemplo, APP_KEY do Laravel, chaves de assinatura)falsificação de sessão, login por personificação
Segredos OAuthtomada de controle de apps vinculados

De fato, expor o .env é um incidente clássico. → O .env exposto ao mundo inteiro

Casos reais: arquivos .env expostos sendo visados

  • Uma operação de extorsão em grande escala (2024): a equipe de pesquisa de uma empresa de segurança relatou uma atividade que visou 110.000 domínios, coletou arquivos .env expostos em servidores web, usou as credenciais de nuvem contidas neles para levar dados e exigiu resgate. Foram coletadas mais de 90.000 variáveis, cerca de 7.000 delas de serviços de nuvem e cerca de 1.500 de contas de redes sociais. A causa não foi uma vulnerabilidade do provedor de nuvem, e sim a configuração incorreta das organizações que expuseram seus .env
  • Vercel (abril de 2026): um acesso não autorizado a sistemas internos levou à leitura das variáveis de ambiente de alguns clientes — as guardadas na categoria cujos valores podem ser exibidos novamente → análise completa (em inglês)
  • Repositórios públicos (um estudo de 2026): mais de 540.000 credenciais publicadas no GitHub ainda estavam válidas na época do estudo. Apagar o arquivo ou o histórico não adianta se a credencial não for revogada → análise completa (em inglês)

O primeiro caso mostra que arquivos .env expostos não são achados por pessoas navegando — eles são coletados de forma automática e em grande escala. Não presuma que um site pequeno não será encontrado.

O vazamento típico = um erro de posicionamento

A maior causa é "colocar o aplicativo inteiro no diretório público (docroot)". Onde só public/ deveria ser servido, expor o diretório pai torna o .env alcançável também.

✗ Perigoso (app na raiz pública)

public_html/
├─ .env   ← legível!
├─ app/
└─ public/

✓ Seguro (app fora, só public servido)

app-root/
├─ .env   ← inalcançável
├─ app/
└─ public_html/ → public/
Mantenha o app fora do docroot e sirva apenas public/. Só isso já torna o .env inalcançável.

Além do posicionamento, ele também vaza por estes caminhos:

  • Fazer commit dele no Git (público na hora num repositório público; visível para todos com acesso num privado)
  • Deixar backups como .env.bak ou .env.old no diretório público
  • Distribuir uma imagem de contêiner ou um zip com o .env ainda dentro
  • Colocar segredos em variáveis NEXT_PUBLIC_ / VITE_, como descrito acima

Como protegê-lo

1

Não o coloque em um diretório público

Mantenha o app fora do docroot; sirva apenas public/. Passos concretos para hospedagem compartilhada: este guia.

2

Não o commit no git

Adicione .env* ao .gitignore e compartilhe apenas um .env.example com valores vazios.

3

Gire tudo se ele vazar

Não apenas a chave confirmada — substitua todas as chaves que estavam no .env. Aja como se todas tivessem sido vistas.

4

Faça autoverificação regularmente

Crie o hábito de verificar que /.env não pode ser aberto no seu próprio site.

Como verificar o seu site e o seu repositório

Autoverificação (apenas contra domínios que você possui)

# Um 200 com corpo significa que está exposto. 403/404 está ok por enquanto.
curl -sI https://yourdomain/.env | head -1
curl -sI https://yourdomain/.git/config | head -1

Verificar isso a cada deploy detecta erros de posicionamento cedo.

Verifique tanto o lado de fora do site quanto o interior do repositório.

  1. Para um site cuja propriedade você verificou, a auditoria de segurança do site checa /.env, /.env.local, /.env.bak e caminhos parecidos de uma só vez
  2. No repositório, rode git log --all --oneline -- .env para ver se ele já foi commitado alguma vez. Se aparecer algo, revogue as chaves que ele continha
  3. Cole configurações ou código no scanner de vazamento de segredos para achar chaves de API ou chaves privadas escritas direto no código (ele roda no seu navegador)
  4. Revise a lista de variáveis NEXT_PUBLIC_ / VITE_ para garantir que nenhum segredo vá parar no JavaScript gerado pelo build

A visão deste site: decida juntos onde o .env fica e como revogar as chaves dele

A maioria dos incidentes com .env começa com um único arquivo no lugar errado. O que faz o dano se espalhar depois é não ter um procedimento definido para trocar as chaves.

Neste site recomendamos que, se você usa .env, além de mantê-lo fora do diretório público e do Git, deixe anotado com antecedência como revogar e reemitir cada chave que ele contém. Em produção, migrar para um gerenciador de segredos na nuvem ou para variáveis de ambiente cujos valores não podem ser exibidos novamente reduz ainda mais os caminhos de vazamento.

Fontes (primárias)

  • The Twelve-Factor App, "III. Config" (em inglês) — 12factor.net (guardar a configuração em variáveis de ambiente; o teste do open source)
  • Documentação do Next.js, "Environment Variables" (em inglês) — nextjs.org (NEXT_PUBLIC_ é embutido no JavaScript no build; não commitar arquivos .env)
  • Documentação do Vite, "Env Variables and Modes" (em inglês) — vite.dev (variáveis VITE_ ficam expostas ao código do cliente)
  • Unit 42 (Palo Alto Networks), "Leaked Environment Variables Allow Large-Scale Extortion Operation in Cloud Environments" (15 de agosto de 2024) (em inglês) — unit42.paloaltonetworks.com

Leia a seguir

Classificação

O CWE classifica os tipos de fraqueza por trás das vulnerabilidades; o MITRE ATT&CK classifica as técnicas dos atacantes. Ambos são mantidos pela MITRE e amplamente usados para rotular vulnerabilidades e regras de detecção.

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

QPosso commitar o .env no git?
A

Não. Adicione o .env ao .gitignore. Em vez disso, commit um .env.example com valores vazios para compartilhar quais chaves são necessárias.

QSe até mesmo um segredo vazar do .env, o que eu giro?
A

Não apenas o que você confirmou — gire todas as chaves que estavam no .env. Prioridade: segredos de API externa / OAuth → chaves de criptografia → e-mail → banco. Aja como se todas tivessem sido vistas.

QComo verifico se o .env vazou?
A

Abra https://seudominio/.env num navegador. Se o conteúdo aparecer, está exposto (200 com corpo = ruim). Se estiver bloqueado (403/404), você está bem por enquanto.

QO que significa .env?
A

Costuma ser lido como 'ponto env'. env é a abreviação de environment (ambiente), e o ponto no início marca um arquivo oculto no Linux e no macOS. O arquivo é uma lista de linhas NOME=valor, como DB_PASSWORD=…, que o aplicativo carrega como variáveis de ambiente.

QPosso colocar segredos em variáveis que começam com NEXT_PUBLIC_ ou VITE_?
A

Não. No Next.js (NEXT_PUBLIC_) e no Vite (VITE_), as variáveis com esses prefixos têm seus valores embutidos, no momento do build, no JavaScript enviado ao navegador, onde qualquer pessoa pode lê-los. Estar no .env não as torna secretas. Use chaves de API apenas no código do lado do servidor e não dê a elas esses prefixos.

QEnviei o .env para o GitHub sem querer. E agora?
A

Primeiro revogue e reemita todas as chaves que ele continha. Apagar o arquivo ou reescrever o histórico não desfaz cópias que já podem existir, então a revogação vem antes da exclusão. Depois adicione o .env ao .gitignore e remova-o do histórico.