DEV Community

Victor Zarzar
Victor Zarzar

Posted on

A importância de gerenciar corretamente variáveis de ambiente (.env)

O arquivo .env é um dos mais sensíveis de qualquer projeto. Ele costuma armazenar informações críticas, como:

  • Token de API
  • URL de banco de dados
  • JWT e Refresh Token de autenticação
  • Chaves privadas
  • Parâmetros de build e deploy

Gerenciar corretamente esse arquivo é essencial para a segurança, organização e sustentabilidade do projeto.

1. Por que versionar o .env é extremamente perigoso?

Mesmo que você remova o arquivo depois, o Git mantém o histórico — tanto no GitHub quanto no GitLab. Ou seja: se você comitar um .env uma única vez, ele estará exposto para sempre no histórico do repositório.

O impacto disso pode ser devastador. Um .env exposto permite:

  • Acesso direto a serviços externos
  • Consumo de APIs com permissões elevadas
  • Login indevido via token JWT
  • Acesso completo ao banco de dados
  • Reconstrução parcial da sua infraestrutura (engenharia reversa)
  • Execução de rotas internas do backend, podendo até resultar em um ataque DDoS massivo

Esse tipo de vazamento é um dos incidentes mais comuns em repositórios públicos — e também um dos mais sérios.

2. Sempre use .gitignore para evitar possíveis vazamentos de dados

Uma prática simples que evita muito prejuízo é inserir no .gitignore:

.env
*.env
.env.*
Enter fullscreen mode Exit fullscreen mode

Assim, qualquer arquivo de variável de ambiente fica protegido contra versionamento acidental.

3. Fluxos práticos usando tecnologias comuns no meu dia a dia

A seguir, dois exemplos de boas práticas que utilizo:

Flutter/Dart usando --dart-define

No Flutter, podemos passar variáveis sensíveis no momento da build usando --dart-define. O fluxo costuma ser:

  1. Antes da build, exportar as variáveis no terminal
  2. O CI/CD injeta secrets dinamicamente
  3. A aplicação recebe tudo via --dart-define

Exemplo:

flutter build apk \
  --dart-define=API_URL=$API_URL \
  --dart-define=ENV=production \
  --dart-define=SENTRY_DSN=$SENTRY_DSN
Enter fullscreen mode Exit fullscreen mode

Essa abordagem evita expor valores sensíveis. Além disso, reduz chances de engenharia reversa, pois os valores só existem no runtime ou no binário ofuscado.

Python + FastAPI usando Pydantic Settings v2

O Pydantic Settings v2 é uma ótima forma de manipular os ambientes via .env.

Ele permite:

  • Tipagem das envs
  • Validação automática
  • Defaults seguros
  • Carregamento via Docker (env_file, environment etc.)
  • Suporte limpo a ambientes dev e prod

Exemplo prático (Dev + Prod):

import os
from pydantic_settings import BaseSettings, SettingsConfigDict

def get_env_file():
    env = os.getenv('ENVIRONMENT', 'development')
    if env == 'production':
        return '.env.prod'
    return '.env.dev'


class Settings(BaseSettings):

    SECRET_KEY: str
    ACCESS_TOKEN_EXPIRE_MINUTES: int

    MYSQL_DATABASE: str
    MYSQL_USER: str

    model_config = SettingsConfigDict(
        env_file=get_env_file(),
        env_file_encoding='utf-8'
    )


settings = Settings()
Enter fullscreen mode Exit fullscreen mode

Esse padrão funciona muito bem com projetos que precisam rodar simultaneamente em dev, staging e produção.

4. Evite engenharia reversa e exposição acidental

Versionar arquivos .env expõe:

  • Estrutura da API
  • Chaves privadas
  • Senhas
  • Configurações internas
  • Insights sobre a arquitetura do projeto

Com isso, alguém mal-intencionado pode:

  • Identificar provedores utilizados
  • Descobrir endpoints privados
  • Simular requests com autenticação válida
  • Acessar serviços internos
  • Comprometer outros projetos conectados

Esse tipo de vazamento pode derrubar toda a infraestrutura, dependendo do que for exposto.

Conclusão

Se prevenir no mundo do desenvolvimento software nunca é demais. E este artigo, aborda só a ponta do iceberg quando falamos de desenvolvimento seguro.

Gerenciar corretamente variáveis de ambiente é algo extremamente importante: é parte fundamental da segurança, da organização e da saúde do projeto — especialmente em ambientes modernos que usam CI/CD, Docker e múltiplos ambientes (dev, staging, prod).


Top comments (0)