
Diff de 400 linhas, e a gente lê as três primeiras. Foi assim que entraram aqui um var_dump no meio do checkout e uma senha de teste chumbada numa constante. O que resolveu foi parar de tentar ler tudo: um script que recebe o git diff --staged pela entrada padrão e cospe só as linhas adicionadas suspeitas.
<?php
// bin/revisa.php — uso: git diff --staged -U0 | php bin/revisa.php
$regras = [
'debug' => '/b(var_dump|print_r|dd|dump|console.log)s*(/',
'segredo' => '/(senha|password|passwd|secret|api_?key|token)s*[=:]s*[x27"][^x27"]{6,}/i',
'pendente' => '/b(TODO|FIXME|XXX)b/',
'erro_off' => '/error_reportings*(s*0s*)|@$?[a-z_]+s*(/i',
];
$arquivo = '';
$achados = [];
while (($l = fgets(STDIN)) !== false) {
if (str_starts_with($l, '+++ b/')) { $arquivo = trim(substr($l, 6)); continue; }
if ($l[0] !== '+') { continue; }
foreach ($regras as $nome => $re) {
if (preg_match($re, $l)) {
$achados[] = sprintf('[%s] %s: %s', $nome, $arquivo, trim(substr($l, 1)));
}
}
}
echo $achados ? implode(PHP_EOL, $achados) . PHP_EOL : 'staged limpo' . PHP_EOL;
exit(0); O -U0 não é enfeite. O filtro do + já descarta as linhas de contexto, mas com -U0 o que trafega é só o que entrou no índice, e isso conta quando a saída vai parar num assistente. A regra erro_off é a mais barulhenta: o @ pega qualquer função silenciada. Ajuste as quatro pro seu código.
cat > .git/hooks/pre-commit <<'SH'
#!/bin/sh
git diff --staged -U0 | php bin/revisa.php
exit 0
SH
chmod +x .git/hooks/pre-commit Esse cat > sobrescreve o hook que já existir: se o projeto usa husky ou captainhook, acrescente a linha no arquivo atual. O exit 0 fixo é proposital: hook que barra commit vira hook que todo mundo pula com --no-verify. Ele avisa, você decide.
A saída curta é o que torna a revisão automática viável: em vez de despejar o diff inteiro num assistente, você manda dez linhas e pergunta o que dá pra quebrar ali. Menos a linha marcada como segredo — essa não sai da máquina. Se o script achou senha ou chave, tire do índice com git restore --staged e rode a troca da credencial.
O banner aparece, o visitante não clica em nada e o Analytics já gravou cookie. Veja como segurar o script…
O campo está no schema.graphqls e a API insiste em Cannot query field. Limpe o cache certo, recompile o generated…
Padrão registrado no functions.php que não aparece na aba Padrões. O caminho curto do WordPress 6.9: um arquivo PHP na…
Disco lotando por causa do banco? Uma query no information_schema mostra qual tabela cresceu, quanto é dado, quanto é índice…
Sistema em CodeIgniter 3.1.13 morre no primeiro request depois do upgrade. Os três pontos que quebram no PHP 8.3 e…
Metade do seu pub/media é miniatura descartável. Veja o rsync com os excludes certos e o comando que reconstrói o…