Privacy ferramentas
O que um site realmente aprende do seu IP público, dos cabeçalhos de requisição e do hardware legível por JavaScript — mais como ocultar dados de arquivos HAR, URLs e tokens antes de compartilhá-los.
3 ferramentas
Três observadores, três camadas de dados
Quando o seu JavaScript começa a rodar, o site já sabe bastante. A camada de transporte já lhe entregou o endereço IP público pelo qual você saiu e, só a partir desse endereço: o ASN que anuncia o prefixo, uma estimativa geográfica grosseira, a versão de HTTP negociada e a versão de TLS que o seu cliente ofereceu. Nada disso é opcional, nada disso envolve um cookie, e todo proxy reverso no caminho registra a maior parte por padrão. O Verificar IP mostra o que a sua própria conexão expõe — IP, cidade, região, país, provedor, ASN, fuso horário, o PoP de borda que terminou a requisição, protocolo HTTP e TLS.
A segunda camada é o que o navegador oferece nos cabeçalhos de requisição:
User-Agent, Accept-Language, Accept-Encoding, Referer e os client hints
Sec-CH-UA-*. Baratos de coletar, registrados em todo lugar e — diferente da
camada de rede — autodeclarados, portanto também trivialmente falsificáveis. A
terceira camada é o que o script mede depois do carregamento: screen.width e
devicePixelRatio, Intl.DateTimeFormat().resolvedOptions().timeZone,
navigator.hardwareConcurrency, navigator.deviceMemory, maxTouchPoints, mais
artefatos de renderização de <canvas>, WebGL, AudioContext e sondagem de
fontes. A Impressão Digital do Navegador lê essa
camada localmente, até uma assinatura de renderização em canvas.
O modelo mental que importa: nenhum valor isolado precisa ser secreto. O seu
fuso horário é informação pública. O fingerprinting funciona sobre a distribuição
conjunta — um valor compartilhado por um usuário em 2^k contribui com k bits de
entropia, e os bits se acumulam, com aproximadamente 33 bits separando uma pessoa
entre 8,6 bilhões. Sinais correlacionados somam menos do que a soma das partes
(platform: MacIntel e um user agent Macintosh são praticamente o mesmo bit),
então figuras publicadas por atributo nunca se somam de forma simples. O
Panopticlick mediu aproximadamente 10,0 bits para o User-Agent, 6,09 para os
cabeçalhos Accept, 4,83 para resolução de tela mais profundidade de cor e 3,04
para fuso horário; os famosos ~18,1 bits eram a média de um fingerprint inteiro
naquele estudo, dominada pela enumeração de plugins (15,4 bits) e de fontes (13,9
bits) que os navegadores modernos em grande parte fecharam — e, como os valores de
cabeçalho e de tela se sobrepõem, eles não podem se combinar acima daquela média
de fingerprint inteiro. Trabalhos posteriores sobre uma população muito maior
(Gomez-Boix et al., 2 milhões de fingerprints) encontraram navegadores cotidianos
ainda menos únicos. A lição é o mecanismo, não um número-alvo: uma dúzia de
atributos entediantes é suficiente para manter um visitante que retorna
reconhecível sem cookie algum.
Duas consequências que engenheiros entendem ao contrário: o endereço IP é o
identificador mais durável da pilha e um dos sinais de localização mais fracos; e
a entropia é simétrica, então falsificar um valor para algo incomum torna você
mais identificável. Um User-Agent que se diz iPhone ao lado de uma tela de
3440×1440, 16 núcleos de CPU e maxTouchPoints: 0 é um fingerprint de um.
Referência de sinais
| Sinal | Observador | Entropia aproximada | Estabilidade |
|---|---|---|---|
| IP público | Rede, antes do JS | Alta, compartilhada com pares atrás de NAT | Muda por rede / VPN |
| ASN + organização | Rede, antes do JS | ~5–10 bits | Estável por provedor |
Accept-Language | Cabeçalho de requisição | ~5–8 bits | Muito estável |
User-Agent, Sec-CH-UA-* | Cabeçalho + JS | ~10 bits, encolhendo | Estável até a atualização do navegador |
| Fuso horário | JS | ~3–5 bits (~400 fusos IANA) | Viaja com você, não com o IP |
Tela + devicePixelRatio | JS | ~5–8 bits | Muda quando você acopla um monitor |
Núcleos de CPU (hardwareConcurrency) | JS | ~2–3 bits | Fixo por máquina; contagem bruta, não agrupada (6, 10, 12, 20 são todos comuns) |
Memória do dispositivo (deviceMemory) | JS | ~1–2 bits | Fixa; agrupada em 0,25/0,5/1/2/4/8 GB e limitada a 8 |
| Renderização em canvas | JS | ~8 bits | Muito estável por GPU + driver |
| String do renderizador WebGL | JS | ~10 bits ou mais | Muito estável |
| Enumeração de fontes | JS | Alta no desktop | Estável por instalação |
ID em cookie / localStorage | Atribuído pelo servidor | Único por projeto | Até o usuário apagar |
As figuras são estimativas de ordem de grandeza vindas de estudos populacionais publicados, não uma medição do seu navegador: um sinal vale mais bits em uma população diversa e menos em uma homogênea. Note que a última linha é o único identificador que um usuário pode apagar — tudo acima dela se regenera na visita seguinte.
O que vai embora junto com o artefato
A maioria dos vazamentos reais não é rastreamento. É um artefato de depuração colado em um ticket.
| Artefato | O que o destinatário ganha | Campos que carregam isso |
|---|---|---|
| Exportação HAR | Uma sessão funcionando, mais todo corpo de resposta que aquela aba conseguia ler | Cookie, Set-Cookie, Authorization, x-api-key, ?token=, postData.text, content.text |
| Uma URL em um ticket | Identidade da conta e acesso que continua funcionando até expirar | ?session=, ?sig=, X-Amz-Signature, parâmetros de rastreamento com um e-mail em hash |
| Um JWT em um relatório de bug | Quem é o usuário e o que ele pode fazer — sem chave nenhuma para ler | sub, email, tenant, roles, exp |
Cabeçalhos de e-mail brutos, .eml | O caminho real do remetente e a sua topologia interna | Received: (host from, IP de origem), X-Originating-IP, hostnames internos em by |
| Uma linha de log em um ticket | O IP real do usuário ao lado do modelo do dispositivo e da build do sistema | X-Forwarded-For, remote_addr, tokens de modelo do User-Agent (SM-G991B, Build/…) |
| Captura de tela do DevTools | Qualquer painel que estivesse aberto, como pixels que nenhum scanner de segredos vai pegar | Network → corpo da resposta, Application → coluna Value dos Cookies |
Qual ferramenta para qual pergunta
«Em qual endereço eu estou agora?» é a única pergunta que não pode ser respondida
localmente: só um endpoint remoto vê o endereço pelo qual você sai, e é por isso
que o Verificar IP consulta api.sitekits.dev (metadados
devolvidos de volta, nada armazenado). O ifconfig lhe dá um endereço de rede
local, não o que a lista de permissões do seu firewall precisa. «O que um script
consegue ler sobre esta máquina?» é o caso oposto, inteiramente local: a
Impressão Digital do Navegador cobre as linhas de
cabeçalho, tela e hardware mais uma assinatura de canvas truncada, mas não enumera
fontes, WebGL ou áudio — leia como auxílio de inspeção, não como pontuação de
unicidade. Recorra ao Parseador UserAgent quando você
tem uma string de UA vinda de um log e nenhum navegador ao vivo.
Use os Cabeçalhos HTTP para auditar o que uma origem diz
sobre a sua privacidade: o Referrer-Policy decide quanto da URL é encaminhado
a terceiros, e as flags do Set-Cookie decidem quanto tempo um identificador
atribuído sobrevive. A busca acontece no servidor, então você recebe cabeçalhos
brutos da origem sem ruído do navegador — apenas cabeçalhos, nunca o corpo.
Roteirizando a tabela acima: passe uma exportação HAR pelo
Sanitizador HAR antes de ela sair da sua máquina — ele
substitui os cabeçalhos que casam, os tokens da query string e os dois corpos por
[REDACTED] e informa quantos valores tocou — e depois abra a cópia sanitizada no
Visualizador HAR para confirmar que os tempos e códigos de
status de que você precisava sobreviveram; esse par é coberto no
guia do HAR. Expanda um link suspeito com o
Parseador de URL antes de colá-lo, decodifique um token
capturado com o Decodificador JWT para ver exatamente quais
claims você estaria repassando, e passe um bloco de cabeçalhos brutos pelo
Analisador de Cabeçalhos de E-mail para ver a cadeia
Received: que você está a ponto de publicar. Esses quatro rodam na página e não
enviam nada. Uma captura de tela não tem essa opção: recorte-a, porque desfocar
não é ocultar. A higiene de tokens de forma mais ampla fica em
ferramentas de segurança e na
seleção para segurança.
Pegadinhas
Tratar geolocalização como posição
O campo city é onde o prefixo está registrado. Operadoras móveis aterram
regiões inteiras em um único registro, e um ASN de datacenter carregando uma
cidade de aparência residencial é uma contradição que vale investigar em vez de
aceitar.
Ocultar só os campos que você consegue ver
A ocultação baseada em padrões casa com uma lista fixa de nomes de cabeçalho e com
nomes de parâmetro que contenham
token|key|secret|password|passwd|pwd|auth|session|sig|signature. Um segredo em
um segmento de caminho de URL (/v1/reset/9f3a…) ou sob um nome interno da casa
passa batido. Passe os olhos pela saída sanitizada antes de anexá-la.
Esquecer que a própria URL é dado
Query strings aterram em cabeçalhos Referer, em logs de acesso de CDN, no
histórico do navegador e em pipelines de analytics. É por isso que URLs assinadas
expiram, e por isso que dados pessoais nunca deveriam ser um parâmetro de
consulta. Analise antes de colar.
Supor que um cliente HTTP do lado do navegador é neutro
O Testador REST API envia requisições do seu navegador
direto para a URL que você digita — sem servidor do sitekits no caminho. Bom para
a privacidade, mas o destino, portanto, vê o seu IP real, o seu User-Agent e
qualquer credencial que você cole na caixa de cabeçalhos. Use um token descartável
quando o endpoint não é seu.