Passei alguns dias construindo o Audit-X, uma ferramenta gratuita que lê o que um site entrega publicamente — certificado, cabeçalhos de segurança, cookies, rastreadores — e devolve um laudo em português explicando o que está exposto, por que aquilo importa para o negócio e como consertar.
Antes de mostrar para qualquer pessoa, fiz o teste óbvio: colei o endereço do meu próprio site.
Levei dois alertas.
O alerta que eu consertei em uma linha
O primeiro foi de severidade média: o meu servidor anunciava a versão exata do PHP em todo carregamento de página, num cabeçalho chamado X-Powered-By.
Isso parece bobagem e não é. Existe uma indústria inteira de robôs varrendo a internet procurando exatamente essa informação: descobrem a versão, cruzam com a lista de falhas conhecidas daquela versão e tentam a que serve. Anunciar a versão é entregar de graça o trabalho de reconhecimento que o atacante teria que fazer.
A correção é uma linha no .htaccess:
Header always unset X-Powered-By
Deployado, testado, alerta resolvido. Esse foi o fácil. E foi um achado real: eu não sabia que estava expondo aquilo, e provavelmente não descobriria tão cedo se não tivesse construído a ferramenta.
O erro que quase passou batido: a ferramenta me aprovou por engano
Aqui a história fica interessante.
Uma das checagens verifica se o site tem link para uma política de privacidade — exigência de transparência da LGPD e, na prática, a primeira coisa que o jurídico de um cliente maior procura. No meu laudo, essa checagem passou. Verde.
Só que rodei de novo mais tarde e ela falhou. Mesmo site, mesma ferramenta, resposta diferente.
Isso é muito pior do que um alerta. Um laudo que muda de opinião entre duas execuções não vale nada — a pessoa roda, recebe um resultado, mostra para alguém, roda de novo e recebe outro. Perdeu a confiança, perdeu o produto.
Fui atrás e achei duas coisas, uma pior que a outra:
- A checagem procurava a expressão em qualquer lugar do HTML. Minha home tem conteúdo rotativo, e a expressão "política de privacidade" aparecia ora na descrição de um card de produto, ora não. O veredito acompanhava o rodízio.
- E quando passava, passava por causa de um link quebrado. Havia um endereço antigo,
/portscomplete/privacidade.html, que redirecionava para uma página que não existia mais. A checagem via o texto no link, dava OK e seguia. Eu estava sendo aprovado por causa de um link para o nada.
Ou seja: a checagem estava errada em duas dimensões ao mesmo tempo. Instável, e generosa no momento errado.
Reescrevi para olhar estrutura, não texto: agora ela só considera um link de verdade — cujo endereço termina no caminho da política, ou cujo texto é curto e diz exatamente aquilo. Um post de blog sobre política de privacidade, por exemplo, deixou de contar como uma política de privacidade, o que é o comportamento correto.
Rodei cinco vezes seguidas no mesmo alvo. Cinco vereditos idênticos. Aí sim.
A lição que fica: heurística que roda sobre página com conteúdo dinâmico precisa se ancorar em estrutura, não em texto solto. Foi o meu próprio site — justamente por ter conteúdo rotativo — que expôs o defeito.
O buraco que eu não sabia que tinha
Com a checagem consertada, ela passou a me reprovar. Corretamente: o bpso.com.br não tinha política de privacidade nenhuma.
E não era detalhe formal. O site captura e-mail de newsletter, tem um chat que envia as mensagens para um serviço de IA de terceiro, roda medição de audiência. Isso é tratamento de dado pessoal. Faltava o documento que a LGPD exige.
A ironia é boa demais para não contar: eu publico o PolicyForge, uma ferramenta gratuita que gera política de privacidade. E não tinha uma.
Escrevi então a Política de Privacidade e os Termos de Uso — e fiz questão de que não fossem modelo genérico. Fui no código, listei endpoint por endpoint o que cada um grava, e o documento descreve isso. Onde o site é bom nisso (a medição própria não usa cookie nem guarda IP; o Audit-X não guarda o endereço auditado; o sorteio do Tirei Você é cifrado e apagado sozinho em 90 dias), o texto diz. Onde não é, também diz.
Um detalhe que virou regra para mim: a política declarava que os registros de navegação ficam guardados por até 12 meses — e o código não apagava nada. Então implementei o expurgo antes de publicar. Política que descreve algo diferente do que o código faz é ficção, e ficção documentada é pior que silêncio.
O alerta que eu decidi manter
Sobrou um, de severidade alta: rastreadores de terceiros carregando já na abertura da página. No caso, o Google Analytics.
Esse eu não consertei. Decidi manter — e quero explicar, porque a decisão é mais interessante que a correção.
Sob a LGPD, transparência e base legal são exigências separadas. Publicar a política resolve a transparência: agora está escrito lá que uso o Analytics e o que ele coleta. Mas a política não me dá o direito de tratar — ela conta o que eu faço, não me autoriza a fazer. Para o rastreador, o caminho correto seria carregar só depois do consentimento.
Eu escolhi não fazer isso agora. Gosto de acompanhar a audiência, o volume do site é pequeno, e um banner de consentimento adicionaria atrito justamente no ponto em que já converto pouco. É uma escolha de negócio, com a exposição assumida — não é ignorância do problema.
O que me interessa aqui é o que eu não fiz.
A tentação de mexer na régua
Quando percebi que a minha própria ferramenta ia exibir um alerta alto no meu próprio site, para qualquer pessoa que testasse, a ideia apareceu sozinha e parecia até razoável:
"E se rastreador de ferramenta consagrada, tipo o Google, fosse severidade menor?"
Soa técnico. Soa quase justo. É a pior decisão possível, por três motivos.
Primeiro: a exposição não diminui porque a ferramenta é boa. O Google Analytics é o caso de maior exposição justamente porque é onipresente e envia dado do visitante para um terceiro, fora do país. "É o Google" não é base legal.
Segundo: seria dar nota à própria prova. Eu mudaria o julgamento da ferramenta exatamente no item em que eu era reprovado. Não existe forma honesta de descrever isso.
Terceiro: destruiria a única coisa que a ferramenta tem de valioso. Existem cinco scanners de segurança gratuitos melhores que o meu em inglês. O que o Audit-X tem é avaliar LGPD brasileira com honestidade. No instante em que a régua é ajustada para favorecer quem a construiu, ela vira folheto de marketing com aparência de laudo.
Manter o Analytics e assumir o alerta é uma decisão. Esconder o alerta seria um defeito.
E tem um efeito colateral que eu não esperava: nota perfeita na auditoria do próprio autor cheira mal. Um "alto" assumido, explicado publicamente, é mais convincente do que um placar impecável que ninguém sabe como foi obtido.
O que o teste de um usuário achou em cinco minutos
Depois de tudo isso, a ferramenta no ar, alguém clicou no botão duas vezes.
Não havia trava. Os dois cliques dispararam duas auditorias, os dois laudos foram renderizados um por cima do outro, e a impressão saía duplicada. Pior: cada clique consumia uma auditoria da cota do usuário — então quem clicasse duas vezes por impaciência gastava o dobro sem saber.
A correção é banal — travar o botão enquanto a auditoria roda. O detalhe que quase me escapou é que a trava só pode ser liberada quando a revelação do laudo termina, não quando a resposta chega: a revelação é progressiva e assíncrona, então soltar cedo ainda deixaria duas se intercalando.
Registro isso porque é o tipo de bug que nenhum teste automatizado meu pegaria e nenhuma revisão de código apontaria. Precisou de dedo humano impaciente.
O que eu tirei disso
Três coisas, e nenhuma é sobre segurança de site:
- Aponte a ferramenta para você primeiro. As duas melhores correções do projeto — o cabeçalho vazando versão e a checagem instável — vieram da auditoria da própria casa, não de revisão de código. Software que examina os outros deveria começar examinando quem o escreveu.
- Quando o resultado incomoda, conserte o mundo, não o medidor. A pressão para ajustar a régua não vem de má-fé; vem de querer que o número fique bonito. É por isso que ela é perigosa: parece razoável na hora.
- Documento que não bate com o código é ficção. Vale para política de privacidade, vale para README, vale para proposta comercial. Se está escrito que apaga em 12 meses, tem que apagar.
O laudo do meu site hoje mostra um alerta alto e dezesseis verificações aprovadas. Não é perfeito — é honesto. E eu prefiro assim, porque é a única versão que eu consigo defender numa conversa.
O Audit-X é gratuito, não pede cadastro e não guarda o endereço auditado. Roda em segundos.
Tirar uma chapa do meu site →
Se o assunto for maior que um laudo, eu trabalho com isso: veja segurança e adequação à LGPD.