Como os sites identificam você e como os desenvolvedores podem reduzi-lo


Você limpa seus cookies, abre uma janela privada e visita um site novamente. Ele ainda conhece você.

Não há nada de errado com as configurações do seu navegador. O que você está vendo são impressões digitais do navegador. Um site reúne discretamente pequenos detalhes sobre o seu dispositivo, como o tamanho da tela, as fontes e como a placa gráfica desenha o texto, e os reúne. Por si só, esses detalhes dizem muito pouco. Combinados, eles geralmente apontam para uma pessoa. E nada disso precisa de um biscoito.

A maioria dos artigos sobre esse assunto para na parte assustadora. Este foi escrito para pessoas que constroem sites, então iremos um pouco mais longe: o que entra em uma impressão digital, como é realmente o código de coleta e o que você pode alterar em seus próprios projetos.

O que entra em uma impressão digital

Pense em uma impressão digital como uma pilha de pistas, em vez de um único valor. Seu fuso horário é compartilhado por milhões de pessoas. A resolução da sua tela também. Junte vinte pistas assim e a multidão diminui rapidamente.

É mais ou menos daqui que vêm as pistas.

Cabeçalhos HTTP. Antes de qualquer JavaScript ser executado, cada solicitação já informa muito ao servidor. A string User-Agent e o cabeçalho Accept-Language revelam seu navegador, sua versão, seu sistema operacional e seus idiomas. Os navegadores Chromium também enviam dicas de cliente.

API JavaScript. Muitas APIs diárias vazam detalhes do dispositivo. screen.width e screen.height, navigator.hardwareConcurrency (sua contagem de núcleos de CPU), navigator.deviceMemory (somente cromo), navigator.platforme seu fuso horário acrescentam algo. As listas de plug-ins costumavam ser uma mina de ouro, mas os navegadores modernos agora retornam uma lista fixa e genérica, de modo que uma delas está praticamente morta.

Renderização. Esta é a parte inteligente. Peça a dois computadores para desenharem exatamente o mesmo texto e os pixels não corresponderão perfeitamente. Fontes, drivers gráficos e a própria GPU alteram ligeiramente a saída. Mesmo navegador, mesma versão, hardware diferente, resultado diferente.

Detalhes da rede. Seu endereço IP, tipo de conexão e até mesmo a forma como seu navegador configura uma conexão TLS podem ajudar. Os IPs mudam, então essas pistas são menos confiáveis. Os rastreadores os usam principalmente para respaldar uma correspondência que já suspeitam.

Quão único isso torna você? Em 2010, o estudo Panopticlick da EFF testou cerca de 470 mil navegadores e descobriu que cerca de 84% deles tinham uma impressão digital única. (O projeto ainda existe, agora chamado Cubra seus rastros.) Estudos posteriores com amostras maiores encontraram números mais baixos, especialmente em telefones, uma vez que muitos telefones compartilham hardware quase idêntico. As percentagens mudam, mas a ideia básica não mudou.

Qual é a aparência do código

As impressões digitais em tela são as que mais falam. Aqui está uma versão básica:

function canvasFingerprint() {
  const canvas = document.createElement('canvas');
  const ctx = canvas.getContext('2d');
  ctx.textBaseline = 'top';
  ctx.font = '14px "Arial"';
  ctx.fillStyle = '#f60';
  ctx.fillRect(0, 0, 100, 30);
  ctx.fillStyle = '#069';
  ctx.fillText('Browser fingerprint', 2, 15);
  return canvas.toDataURL();
}

Leia-o e você nunca imaginaria que era um código de rastreamento. Ele desenha uma caixa laranja, escreve algum texto e exporta a imagem. O problema é que o anti-aliasing e a renderização de subpixel variam de dispositivo para dispositivo, de modo que a string exportada também varia.

O URL dos dados é longo e desajeitado, então os rastreadores geralmente o transformam em algo mais curto. Com a API Web Crypto, são algumas linhas extras:

async function hashString(str) {
  const data = new TextEncoder().encode(str);
  const digest = await crypto.subtle.digest('SHA-256', data);
  return Array.from(new Uint8Array(digest))
    .map((b) => b.toString(16).padStart(2, '0'))
    .join('');
}

const fingerprint = await hashString(canvasFingerprint());

Agora há um ID curto que retorna igual em cada visita, com ou sem cookies. Uma pequena observação se você testar isso sozinho: crypto.subtle só funciona em HTTPS ou host local.

A impressão digital WebGL segue a mesma ideia com gráficos 3D. Um script desenha uma cena oculta e também lê o WEBGL_debug_renderer_info extensão, que pode revelar a marca e o modelo da sua GPU. A impressão digital de áudio é mais sorrateira. O script gera um som, executa-o através de um AudioContexte faz o hash do resultado. Diferentes pilhas de áudio produzem números ligeiramente diferentes.

Vale lembrar que API de tela, WebGLe o API de áudio da web foram desenvolvidos para paradas, jogos e aplicativos de música. O rastreamento é um efeito colateral do quanto eles expõem. O W3C orientação sobre como mitigar impressões digitais em especificações da web aborda como os autores de padrões tentam evitar adicionar novos sinais.

Por que isso é importante se você cria sites

Você pode não escrever uma única linha de código de impressão digital e ainda assim acabar envolvido. Existem três maneiras comuns de isso acontecer.

Suas ferramentas de segurança já podem fazer isso. Alertas de detecção de bots, prevenção de fraudes e “novo login de um dispositivo desconhecido” geralmente são executados em bibliotecas de impressão digital. Esse é um caso de uso justo. Saiba apenas que a lei geralmente vê isso como uma coleta de dados. Na UE, as regras de ePrivacy geralmente exigem consentimento antes de você ler este tipo de informação no dispositivo de alguém. Vários estados dos EUA tratam as impressões digitais como informações pessoais, o que significa divulgação e direitos de exclusão.

Seus scripts de terceiros podem fazer isso sem perguntar a você. Tags analíticas, scripts de anúncios, widgets de bate-papo, botões sociais. Cada um deles pode chamar as mesmas APIs que seu próprio código pode. Se sua página carregar quinze deles, serão quinze possíveis impressões digitais. Verificar o que cada script faz tornou-se silenciosamente parte do trabalho.

Os navegadores estão fechando a porta. O Chrome congelou a maior parte da string User-Agent e moveu informações detalhadas para Client Hints. Safari possui proteção avançada contra impressões digitais. Raposa de fogo bloqueia scripts de impressão digital conhecidose corajoso randomiza valores retornados por APIs que podem ser impressas. Se o seu site depende de APIs antigas e abertas, você está construindo um terreno que diminui a cada lançamento.

Como reduzir impressões digitais em seus próprios projetos

A maior parte disso se resume a uma regra: colete menos e saiba por que está coletando o que sobrou.

1. Remova sinais que você não precisa

Pesquise em sua base de código por itens de alta entropia: exportações de canvas, pesquisas de renderizador WebGL, detecção de fontes e chamadas para navigator.userAgentData.getHighEntropyValues(). Se um recurso ainda funcionar sem eles, remova-os.

Em muitas equipes, a maior vitória é entediante. Alguém adicionou uma biblioteca de impressões digitais anos atrás para uma verificação de fraude, ninguém a revisou desde então e ela ainda está carregando em todas as páginas. Excluí-lo ajuda mais do que qualquer solução inteligente.

2. Mude da análise User-Agent para Client Hints

A string clássica do User-Agent agrupa o navegador, a versão exata, o sistema operacional e a arquitetura da CPU em um cabeçalho. Dicas do cliente separe isso para que você receba apenas o que pede.

Por padrão, os navegadores Chromium já enviam três dicas básicas: Sec-CH-UA, Sec-CH-UA-Mobilee Sec-CH-UA-Platform. Para a maioria dos sites, isso é suficiente e você não precisa solicitar nada extra. Se um recurso realmente precisar de mais detalhes, peça essa dica com Accept-CH:

Accept-CH: Sec-CH-UA-Platform-Version

Ignore os números completos da versão, a arquitetura e o modelo do dispositivo, a menos que você tenha um motivo real. Cada dica extra torna seus visitantes um pouco mais fáceis de distinguir.

Lembre-se de que apenas navegadores baseados em Chromium oferecem suporte a dicas de cliente do agente do usuário. O Firefox e o Safari não os enviarão, então você precisará de um substituto. Sempre que possível, a detecção de recursos supera a detecção do navegador de qualquer maneira.

3. Controle o que o código de terceiros pode alcançar

Aqui está uma verdade incômoda: uma vez que um script é executado em sua página, ele pode chamar APIs de canvas, WebGL e áudio, e não há nenhum cabeçalho que desative isso. O que você pode controlar é quais scripts são executados e quão perto eles chegam da sua página.

Algumas coisas ajudam:

  • Coloque widgets em iframes de origem cruzada em sandbox, em vez de colocar seus scripts diretamente em sua página.
  • Use um Política de segurança de conteúdo isso permite apenas scripts que você realmente revisou.
  • Adicione um Política de permissões isso desativa recursos que você não usa, então o conteúdo incorporado não pode solicitá-los.
Permissions-Policy: camera=(), microphone=(), geolocation=()

Nada disso é uma solução mágica. Juntos, eles reduzem a quantidade de código que tem a chance de capturar impressões digitais de seus usuários.

4. Observe o que você renderiza

Se o seu aplicativo for desenhado em tela (painéis, editores, jogos de navegador), essa saída também poderá ser impressa. Tente não entregar dados brutos do canvas a scripts de terceiros.

As fontes também contam. Carregue quinze fontes incomuns da web e você terá dado a cada script da página uma impressão digital de fonte fácil. Uma pilha de fontes do sistema combina melhor e, para o texto da interface, a maioria dos usuários não notará a diferença.

5. Trate as impressões digitais armazenadas como dados pessoais

Às vezes, você desejará manter uma impressão digital, por exemplo, para sinalizar logins de um dispositivo que você nunca viu antes. Tudo bem, contanto que você trate com cuidado:

  • Armazene um hash, não os sinais brutos.
  • Lembre-se de que um hash ainda conta como dados pessoais pseudônimos, portanto, as regras de privacidade ainda se aplicam.
  • Guarde-o por pouco tempo.
  • Mencione isso em sua política de privacidade.
  • Dê aos usuários uma maneira de redefini-lo.

E por favor, não escreva “não usamos cookies” em sua política de privacidade se você usar impressões digitais. Usuários e reguladores estão cientes disso.

6. Teste em navegadores com foco na privacidade

Antes de enviar, abra seu site no Firefox com a proteção aprimorada contra rastreamento definida como Estrita e no Brave com a proteção contra impressão digital ativada. Se algo quebrar, foi devido a um sinal do qual os navegadores estão tentando se livrar.

Corrija o recurso. Não peça aos usuários que diminuam sua proteção. Os navegadores só ficarão mais rígidos a partir daqui.

O que os usuários podem fazer e o que realmente não ajuda

Muitos conselhos comuns sobre privacidade erram o alvo na impressão digital, por isso vale a pena esclarecer.

Uma VPN altera seu endereço IP, mas a saída da tela, as fontes e o tamanho da tela parecem exatamente iguais ao do site. Portanto, faz muito pouco contra impressões digitais. Limpar os cookies também não ajuda, porque não há nenhum cookie envolvido. As janelas privadas ajudam um pouco em alguns navegadores, mas na maioria deles a impressão digital quase não muda.

O que funciona melhor é um navegador com proteção contra impressões digitais integrada, como Brave, Firefox em configurações restritas, Safari ou Tor Browser. Isso adiciona ruído aos sinais ou faz com que todos pareçam iguais. Extensões que bloqueiam leituras de telas e fontes também podem ajudar. O mesmo acontece com a simples atualização do seu navegador, já que cada versão tende a remover mais alguns detalhes vazados.

Se você quiser indicar aos leitores não técnicos algum lugar para uma análise em inglês simples de quais ferramentas de privacidade realmente ajudam contra o rastreamento e quais apenas ocultam seu IP, os guias de a equipe VPNOverview são um bom lugar para começar.

Nenhuma ferramenta irá parar completamente a impressão digital. A boa notícia é que não é necessário. A impressão digital funciona com base nas probabilidades, portanto, tornar os sinais mais barulhentos costuma ser o suficiente para interromper a partida.

Checklist para o seu próximo projeto

  • Revise cada script de terceiros e observe quais APIs de impressão digital ele pode alcançar.
  • Substitua a análise User-Agent por dicas de cliente e detecção de recursos. Peça apenas o que você precisa.
  • Widgets sandbox em iframes, use um CSP estrito e defina uma política de permissões para recursos que você não usa.
  • Se você armazena impressões digitais por segurança, faça hash delas, defina um limite de retenção e divulgue-o.
  • Teste no Firefox Strict and Brave antes de cada lançamento.
  • Repita a auditoria a cada seis meses ou mais. Os navegadores continuam removendo sinais e as bibliotecas continuam adicionando novos.

A impressão digital existe porque a web fornece aos scripts muitas informações sobre o dispositivo em que estão sendo executados. Não existe um cabeçalho ou API que resolva isso. O que ajuda é o hábito: colete o mínimo que puder, tenha um motivo para tudo o que guarda e presuma que tudo o que você expõe pode ser usado para identificar alguém. Seus usuários obtêm melhor privacidade e você terá menos surpresas desagradáveis ​​quando a próxima atualização do navegador remover algo em que seu código confiava silenciosamente.



Source link