Proteger credenciais em projetos PHP com vlucas/phpdotenv

Categorias: PHP

Baixar Datasheet

Faça o Download deste Datasheet para seu computador

Problema

Credenciais (banco de dados, API keys) hardcoded no código-fonte são commitadas no repositório e ficam expostas no histórico do Git.

Solução

Mover todas as credenciais para um arquivo .env que fica fora do repositório, usando a biblioteca vlucas/phpdotenv para carregá-las como variáveis de ambiente.

Passo a passo

1. Instalar a dependência

Na raiz do projeto (onde está o composer.json):

composer require vlucas/phpdotenv

2. Criar o arquivo .env na raiz do projeto

Preencher com os valores reais do ambiente:

DB_HOST=127.0.0.1

DB_PORT=3306

DB_NAME=meu_banco

DB_USER=meu_usuario

DB_PASSWORD=minha_senha

OPENAI_API_KEY=sk-proj-minha-chave

Este arquivo nunca vai para o repositório. Cada ambiente (local, produção, staging) tem o seu próprio .env.

3. Criar o .env.example na raiz

Modelo sem valores sensíveis — este sim vai para o repositório:

DB_HOST=127.0.0.1

DB_PORT=3306

DB_NAME=

DB_USER=

DB_PASSWORD=

OPENAI_API_KEY=

4. Criar ou atualizar o .gitignore

Adicionar:

.env

vendor/

5. Criar o bootstrap.php na raiz

<?php
require_once __DIR__ . '/vendor/autoload.php';

$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);

$dotenv->load();

$dotenv->required([

    'DB_HOST',
    'DB_PORT',
    'DB_NAME',
    'DB_USER',
    'DB_PASSWORD',
    'OPENAI_API_KEY',

])->notEmpty();

O required()->notEmpty() faz a aplicação parar com erro claro se alguma variável estiver ausente ou vazia.

6. Incluir o bootstrap no ponto de entrada da aplicação

No public/index.php (ou equivalente), substituir:

// ANTES

require '../Application/autoload.php';

require '../vendor/autoload.php';

Por:

// DEPOIS

require '../bootstrap.php';

require '../Application/autoload.php';

O bootstrap.php já carrega o vendor/autoload.php, então não precisa duplicar.

7. Substituir credenciais hardcoded pelo $_ENV

Banco de dados — onde antes tinha:

private $DB_NAME = 'meu_banco';

private $DB_USER = 'root';

private $DB_PASSWORD = 'minha_senha';

Trocar por:

private $DB_NAME;

private $DB_USER;

private $DB_PASSWORD;

private $DB_HOST;

private $DB_PORT;
public function __construct()

{

    $this->DB_NAME     = $_ENV['DB_NAME'];
    $this->DB_USER     = $_ENV['DB_USER'];
    $this->DB_PASSWORD = $_ENV['DB_PASSWORD'];
    $this->DB_HOST     = $_ENV['DB_HOST'];
    $this->DB_PORT     = $_ENV['DB_PORT'];

    $this->conn = new PDO(

        "mysql:dbname={$this->DB_NAME};host={$this->DB_HOST};port={$this->DB_PORT}",
        $this->DB_USER,
        $this->DB_PASSWORD

    );
}

API keys — onde antes tinha:

$apiKey = 'sk-proj-chave-hardcoded';

Trocar por:

$apiKey = $_ENV['OPENAI_API_KEY'];

8. Testar localmente

Acessar a aplicação normalmente. Se alguma variável estiver faltando no .env, o dotenv mostra um erro claro dizendo qual é.

9. Commitar

git add .gitignore .env.example bootstrap.php public/index.php Application/core/Database.php Application/models/Redacoes.php
git commit -m "refactor: mover credenciais para .env via phpdotenv"

Antes do git add, rodar git status e confirmar que o .env não aparece na lista.

Se o .env aparecer, significa que ele já foi rastreado antes. Resolver com:

git rm --cached .env

10. Configurar produção

Criar o .env manualmente no servidor com os valores de produção. Este arquivo é criado uma única vez e não é gerenciado pelo Git.

Deploy: preservar o .env no servidor

Se o script de deploy apaga o diretório antes de clonar (como rm -rf), o .env será apagado junto. A solução é salvar e restaurar:

# Salvar antes de apagar

cp /caminho/do/projeto/.env /tmp/.env.backup
# Apagar e clonar

rm -rf /caminho/do/projeto

git clone git@github.com:usuario/repo.git /caminho/do/projeto
# Restaurar

mv /tmp/.env.backup /caminho/do/projeto/.env

Checklist rápido para novos projetos

  • composer require vlucas/phpdotenv
  • Criar .env com valores reais (local)
  • Criar .env.example sem valores (vai pro repo)
  • Adicionar .env ao .gitignore
  • Criar bootstrap.php com Dotenv::createImmutable
  • Incluir bootstrap.php no ponto de entrada
  • Trocar credenciais hardcoded por $_ENV[‘VARIAVEL’]
  • Verificar com git status que .env não será commitado
  • Criar .env no servidor de produção
  • Ajustar script de deploy para preservar o .env

Este artigo foi escrito por IA, com execução e testes conduzidos pelo autor.

Categorias
Tags