Variáveis de ambiente e segredos: como usar o .env sem vazar senhas

Senhas de banco, chaves de API e tokens não devem ficar no código: o lugar deles é em variáveis de ambiente, que mudam entre a sua máquina, o teste e a produção. Este guia mostra como ler essas variáveis e o arquivo .env em Node.js, Python e PHP, por que um segredo no front-end nunca é segredo e o que fazer quando uma chave vaza no Git.

Por Leonardo Gaertner · Publicado em

Por que variáveis de ambiente

O mesmo código roda em lugares diferentes: na sua máquina, no servidor de testes e em produção, cada um com seu banco e suas chaves. As variáveis de ambiente separam a configuração do código, e os segredos ficam fora do repositório. O arquivo .env é só uma forma prática de definir essas variáveis na sua máquina.

  • Ponha .env no .gitignore e faça commit de um .env.example, com os nomes das variáveis e valores de exemplo.
  • Em produção, defina as variáveis no painel da hospedagem ou no gerenciador de segredos, não em um arquivo no servidor.
  • Para segredos próprios, como a chave que assina sessões, gere valores longos e aleatórios, por exemplo com o gerador de senha.

Em Node.js, sem biblioteca

Desde o Node.js 20.6, node --env-file=.env app.js carrega o arquivo sem instalar o pacote dotenv. A função exigirEnv faz o programa parar na inicialização quando falta uma variável, com uma mensagem clara, em vez de quebrar depois, no meio de uma requisição, com um erro difícil de entender.

JavaScript
// Node.js 20.6+: node --env-file=.env app.js, sem instalar nada.
// Ou no próprio código (Node.js 20.12+): process.loadEnvFile('.env')

function exigirEnv(nome) {
  const valor = process.env[nome];
  if (valor === undefined || valor === '') {
    throw new Error(`Falta a variável de ambiente ${nome}. Confira o arquivo .env.`);
  }
  return valor;
}

// Falha logo na inicialização, e não no meio de uma requisição
const config = {
  bancoUrl: exigirEnv('DATABASE_URL'),
  porta: Number(process.env.PORT ?? 3000),
};

Em Python e PHP

Os dois leem variáveis do ambiente sem pacote extra. Para carregar um arquivo .env, o costume é o python-dotenv no Python e o vlucas/phpdotenv no PHP.

Python
import os

# Para ler o arquivo .env, use o pacote python-dotenv:
#   from dotenv import load_dotenv
#   load_dotenv()


def exigir_env(nome: str) -> str:
    valor = os.environ.get(nome, "")
    if not valor:
        raise RuntimeError(f"Falta a variável de ambiente {nome}. Confira o arquivo .env.")
    return valor


# Falha logo na inicialização, e não no meio de uma requisição
CONFIG = {
    "banco_url": exigir_env("DATABASE_URL"),
    "porta": int(os.environ.get("PORT", "3000")),
}
PHP
<?php
// Para ler o arquivo .env, use o pacote vlucas/phpdotenv (o Laravel já usa)

function exigirEnv(string $nome): string
{
    $valor = getenv($nome);
    if ($valor === false || $valor === '') {
        throw new RuntimeException("Falta a variável de ambiente $nome. Confira o arquivo .env.");
    }
    return $valor;
}

$config = [
    'bancoUrl' => exigirEnv('DATABASE_URL'),
    'porta' => (int) (getenv('PORT') ?: 3000),
];

No front-end, nada é segredo

Tudo que vai para o navegador pode ser lido por qualquer pessoa, inclusive o JavaScript do site. Os frameworks deixam isso explícito com prefixos: só as variáveis com VITE_ (Vite), NEXT_PUBLIC_ (Next.js), PUBLIC_ (Astro) ou REACT_APP_ (Create React App) entram no código do navegador, e por isso nunca devem guardar segredos.

Se o front-end precisa de uma API com chave secreta, a chamada deve passar pelo seu servidor, que guarda a chave e repassa só o resultado.

Se um segredo vazou

  • Troque o segredo imediatamente: gere uma chave nova, atualize os ambientes e revogue a antiga. Essa é a única medida que resolve.
  • Apagar o arquivo ou reescrever o histórico do Git não basta: repositórios públicos são vasculhados por robôs em poucos minutos, e o valor pode já ter sido copiado.
  • Confira nos registros do serviço se a chave foi usada por alguém.
  • Ative a proteção contra envio de segredos do GitHub (secret scanning), que bloqueia o push quando reconhece uma chave conhecida.

Achou um erro neste guia? Avise por e-mail.

Perguntas frequentes

Preciso do pacote dotenv no Node.js?

Não, a partir do Node.js 20.6: rode node --env-file=.env app.js. No próprio código, desde o Node.js 20.12, process.loadEnvFile(".env") faz o mesmo.

Posso colocar uma chave de API em VITE_ ou NEXT_PUBLIC_?

Só se ela puder ser pública. Essas variáveis vão para o JavaScript do navegador, e qualquer pessoa consegue ler. Chaves secretas devem ficar no servidor.

O que fazer se eu subi o .env para o GitHub?

Troque todos os segredos que estavam no arquivo, porque eles podem já ter sido copiados. Depois remova o arquivo, ponha .env no .gitignore e, se quiser, limpe o histórico. Limpar o histórico sem trocar as chaves não resolve.

Devo fazer commit do .env.example?

Sim. Ele mostra quais variáveis o projeto precisa, com valores de exemplo, e ajuda quem clona o repositório a configurar o ambiente. Ele não deve ter valores reais.