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 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
.envno.gitignoree 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.
// 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.
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
// 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.
Ferramentas para usar junto
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.
Outros guias
- Como gerar senha segura em código (sem Math.random)Por que Math.random não serve para senhas, como evitar o viés do módulo e como gerar senhas seguras em JavaScript, Python e PHP, com código testado.
- Como guardar senhas: por que não usar SHA-256 e o que usarPor que MD5 e SHA-256 não servem para senhas e como guardar senhas com scrypt, bcrypt ou Argon2 em Node.js, Python e PHP, com sal e código testado.