Inteligência Artificial

Chave de API fora do Git: .env, getenv() e o que fazer se ela já vazou

Colou a chave da API direto no PHP pra testar, esqueceu, commitou. Antes de qualquer git: revogue a chave no painel do provedor e gere outra. Limpar histórico depois é higiene, quem fecha a porta é a revogação.

Tirando a chave do código

A chave vai pra variável de ambiente. Em servidor com php-fpm eu declaro no pool, que fica fora do projeto e fora do Git:

# /etc/php/8.3/fpm/pool.d/www.conf
env[IA_API_KEY] = "chave-nova-aqui"

# e no PHP
$chave = getenv('IA_API_KEY');
if ($chave === false || $chave === '') {
    throw new RuntimeException('IA_API_KEY não configurada');
}

Mexeu no pool, rode systemctl reload php8.3-fpm. Sem o reload os workers antigos continuam sem a variável e o getenv volta false em parte das requisições.

Se preferir arquivo .env com vlucas/phpdotenv, atenção num detalhe que derruba muita gente: createImmutable popula $_ENV e $_SERVER, mas não alimenta getenv(). Ou você lê por $_ENV[‘IA_API_KEY’], ou usa createUnsafeImmutable. Eu fico no $_ENV.

Bloqueando o arquivo e o commit

Coloque .env no .gitignore antes de criar o arquivo, e trave o acesso pela web no nginx, porque .env dentro da raiz pública é servido como texto puro se ninguém barrar:

location ~ /.(?!well-known).* {
    deny all;
}

Location de regex o nginx avalia na ordem em que aparece no arquivo, então deixe esse bloco acima do location ~ .php$ do site. Depois nginx -t e systemctl reload nginx, e teste chamando /.env no navegador: tem que voltar 403.

Sobre o histórico: git rm –cached .env só para de versionar dali pra frente, o blob antigo continua em todo clone, em cada fork e no cache do provedor. Reescrever com git filter-repo ajuda no repositório privado da equipe, mas troca todos os hashes e exige force-push combinado com quem trabalha ali. Trate a chave antiga como pública para sempre.

Guarde um .env.example com os nomes das variáveis e valores em branco. Quem clona já sabe o que precisa preencher sem ter que te perguntar.

Post Recentes

json_validate no PHP 8.3: conferir se o JSON é válido sem decodificar

A função json_validate do PHP 8.3 diz se a string é JSON válido sem montar array nem objeto. Serve para…

4 horas atrás

HPOS no WooCommerce: ativar as tabelas wc_orders e migrar os pedidos

A opção de armazenamento de pedidos travada em posts e a sincronização que nunca termina: como migrar para as tabelas…

21 horas atrás

str_contains no PHP 8: parar de comparar strpos com !== false

Troque strpos e substr por str_contains, str_starts_with e str_ends_with no PHP 8, com o polyfill para quem ainda mantém servidor…

1 dia atrás

Data Patch Magento 2: criar atributo de produto sem InstallData

Copiou um InstallData.php de tutorial antigo e o atributo não apareceu depois do setup:upgrade? Veja a classe de Data Patch…

2 dias atrás

Criar cupom no WooCommerce por código: WC_Coupon com validade e limite

Função pronta para gerar um cupom único por cliente depois do pedido concluído, com WC_Coupon, data de expiração, limite de…

2 dias atrás

Modifier de produto no Magento 2: campo novo no form sem sobrescrever XML

Como registrar um modifier no pool do formulário de produto do Magento 2 e criar um campo próprio na aba,…

3 dias atrás