Auditei meu próprio site sob a LGPD e achei nove problemas
Um diagnóstico honesto do que estava errado no valmor.net.br: bucket aberto, IP em log, política de vinte linhas e um botão de excluir conta que nunca funcionou.
Vi um vídeo de um criador contando que recebeu uma notificação por descumprimento da LGPD. Produto funcionando, dezesseis mil usuários, faturamento saudável — e nenhuma conformidade. A notificação não veio da ANPD: veio de um advogado que era inscrito do canal e resolveu avisar antes que viesse de alguém com menos boa vontade.
A reação natural é pensar “comigo não”. Resolvi fazer o contrário: abri o código do meu próprio site e procurei os mesmos problemas. Achei nove.
Esta é a parte 1 de uma série contando o que estava errado, o que consertei e o que aprendi. Vou ser específico e desconfortável, porque um post genérico sobre “a importância da conformidade” não ajuda ninguém.
O que eu esperava encontrar
Nada. Sinceramente. O site não tem Google Analytics, não tem Meta Pixel, não tem Sentry, não tem nenhum rastreador de terceiro. A medição de audiência é própria e nunca gravou endereço IP. Eu me achava razoavelmente em dia.
E, de fato, isso já colocava o projeto acima da média. Só que “acima da média” não é o padrão da lei.
Os nove achados
1. O bucket de arquivos estava aberto para qualquer um
Este é o pior, e o que eu menos esperava.
O armazenamento de arquivos tinha uma regra de leitura criada lá no começo do projeto que dizia, em essência, “qualquer pessoa pode ler qualquer objeto deste bucket”. Ela existia por um motivo legítimo — avatares e imagens de galeria precisam ser públicos. O problema é que ela não distinguia quais arquivos.
Resultado: os anexos que clientes enviam ao pedir orçamento — artes, desenhos, às vezes documentos — eram legíveis por qualquer pessoa que descobrisse o caminho. O mesmo valia para arquivos enviados no chat de IA.
Meu primeiro instinto foi me consolar: os caminhos contêm um identificador aleatório, então ninguém adivinharia. Errado por dois motivos. Primeiro, a mesma regra permitia listar todos os arquivos do bucket — não era preciso adivinhar nada. Segundo, dificultar não é controlar.
Isso é exposição de dado de terceiro, e o terceiro aqui é o cliente que confiou o arquivo dele.
2. Endereço IP gravado cru no log de IA
Exatamente o problema do vídeo. Cada requisição ao chat ou ao gerador de imagem gravava o IP do usuário numa tabela de telemetria.
O detalhe que torna isso mais constrangedor: nada lia esse campo. Zero consultas, zero relatórios, zero uso. Era dado pessoal sendo acumulado indefinidamente por inércia — alguém (eu) achou que ia ser útil um dia e nunca foi.
3. User-Agent completo na medição de audiência
A tabela de páginas vistas guardava a string completa do navegador, junto com cidade, resolução de tela e fuso horário. Cada campo isolado é inofensivo. Combinados, formam uma impressão digital razoavelmente distintiva de um visitante pouco comum.
E, de novo: o sistema já extraía navegador, sistema operacional e tipo de dispositivo dessa string. Os campos derivados eram o que os painéis usavam. A string bruta ficava lá, sem função.
4. A política de privacidade tinha vinte linhas
Vinte linhas. Três seções. Frases como “usamos as informações para fornecer e melhorar o serviço”.
Isso não é uma política de privacidade, é um espaço reservado que virou permanente. Não dizia quais dados, com qual base legal, por quanto tempo, nem com quem eram compartilhados.
5. Os termos de uso tinham um marcador de rascunho publicado
O arquivo terminava com a linha literal:
[...Conteúdo expandido seria aqui...]
Isso estava no ar. Em produção. Visível para qualquer visitante.
Não sei há quanto tempo. É o tipo de coisa que você escreve às duas da manhã pensando “amanhã eu termino”.
6. Não havia canal do Encarregado
A LGPD exige que o controlador indique um Encarregado e divulgue publicamente o contato dele. Não havia nem a indicação nem o contato. Uma pessoa que quisesse exercer um direito não tinha para onde escrever.
7. O botão “Excluir conta” era falso
Existia na tela de configurações, desabilitado, com o aviso “disponível em breve”. Não havia endpoint, não havia função, não havia nada. O texto “em breve” estava lá havia meses.
Isso é pior que não ter o botão. Ter o botão comunica que o direito existe; tê-lo desabilitado comunica que ele existe mas você não pode usá-lo.
8. Nenhuma forma de baixar os próprios dados
Direito de acesso e de portabilidade, ambos no art. 18. Nenhum caminho, nem automático nem manual.
9. Transferência internacional não declarada
Esse é o mais delicado tecnicamente. O estúdio de IA manda o que o usuário escreve para provedores nos Estados Unidos e na China — DeepSeek e Qwen são empresas chinesas.
Isso é transferência internacional de dados, tratada no art. 33. Não estava declarada em lugar nenhum, e o usuário não tinha como saber que o texto dele cruzava fronteiras.
Um décimo, de brinde
Enquanto procurava, achei também uma biblioteca 3D sendo carregada de um CDN externo na página inicial. Efeito colateral: o navegador de todo visitante entregava o IP dele para um terceiro que eu nunca declarei e não controlo.
Não é o pior item da lista, mas é o mais fácil de consertar — o arquivo já estava instalado no projeto, só não estava sendo usado.
O que isso me ensinou
Ausência de rastreador não é conformidade. Eu estava confiante porque não usava Google Analytics. Mas a maior parte dos meus problemas não tinha nada a ver com terceiros: era dado próprio, guardado sem finalidade, sem prazo e sem documentação.
“Em breve” é uma dívida com juros. O botão desabilitado e o marcador de rascunho nos termos ficaram no ar porque nada quebrava. Código que não funciona grita; texto que não foi escrito fica quieto.
O que ninguém vê é o que mais dói. Dos nove achados, três eram verificáveis por qualquer visitante sem estar logado — política vazia, termos com rascunho, ausência de Encarregado. Os outros seis, incluindo o bucket aberto, exigiam olhar o código. Numa fiscalização, os dois grupos contam igual.
Denúncia não vem só de fiscal. No caso do vídeo, veio de um espectador simpático. Poderia ter vindo de um concorrente ou de um cliente insatisfeito. Não dá para contar com a boa vontade de quem descobrir.
O que vem a seguir
Consertei tudo. Os próximos posts da série contam como:
- Parte 2 — minimização: por que o jeito mais barato de proteger um dado é não coletar, e por que hash de IP não resolve.
- Parte 3 — como excluir uma conta de verdade sem apagar a nota fiscal.
- Parte 4 — consentimento sem dark pattern, e o aviso de que seu texto vai para a China.
- Parte 5 — governança que não é teatro: registro, RIPD e um cron que avisa quando morre.
Se você tem um projeto no ar que coleta qualquer dado de usuário, sugiro fazer o mesmo exercício. A lista de perguntas é curta: quais dados eu guardo, por que, por quanto tempo, para quem vão, e o que acontece se alguém pedir para sair.
Se você não consegue responder as cinco de cabeça, provavelmente também tem nove.