Privacidade Por Equipe DevBras

Capa do artigo: Foto enviada pelo celular pode publicar o endereço de casa: limpe o EXIF

Foto enviada pelo celular pode publicar o endereço de casa: limpe o EXIF

Descubra quais metadados vêm na foto do celular, remova GPS e dados do aparelho no upload sem perder a orientação e limpe as imagens que já estão publicadas.

Um marketplace de artesanato pede que cada vendedora envie fotos das peças. Uma delas fotografa tudo na mesa da cozinha. Semanas depois, um comprador insatisfeito aparece na porta da casa dela. Ele não hackeou nada: baixou a foto do anúncio, abriu as propriedades do arquivo e copiou as coordenadas de GPS para o mapa. A resposta curta: a imagem que o seu sistema publica não pode ser o arquivo original que a pessoa enviou. No upload, gere uma versão nova só com os pixels, aplicando a rotação antes de descartar os metadados, e guarde o original, se precisar dele, num lugar privado.

Isso não depende de a vendedora lembrar de desligar a localização da câmera. Quem publica é o seu servidor, então a limpeza também é dele.

O que vem escondido num JPEG de celular

EXIF é um bloco de metadados que a câmera grava dentro do arquivo. Em foto de celular, ele costuma trazer a data e a hora exatas, a marca e o modelo do aparelho, configurações da lente e, se a localização estiver ativada para a câmera, latitude, longitude e às vezes altitude e direção. Muitos arquivos trazem também um bloco XMP, com informação de edição, e alguns guardam uma miniatura embutida, que pode mostrar o que foi cortado depois.

O navegador não mexe nisso. Quando a pessoa escolhe a foto num <input type="file">, o arquivo vai para o servidor como está. Alguns sistemas operacionais oferecem a opção de tirar a localização na hora de compartilhar, mas você não controla qual aparelho seu usuário usa nem o que ele marcou.

Formatos diferentes guardam metadados de jeitos diferentes. JPEG, HEIC, WebP, PNG e TIFF podem carregar EXIF ou XMP. Não confie em "PNG não tem isso": a regra segura é tratar todo upload de imagem como portador de metadados até ser regravado.

Como conferir uma foto do seu site agora

O exiftool é a ferramenta de linha de comando mais usada para ler e escrever metadados. Baixe uma imagem publicada no seu site e rode:

exiftool -a -G1 -s foto-do-anuncio.jpg
exiftool -gps:all foto-do-anuncio.jpg

O primeiro comando mostra todos os campos agrupados por bloco. O segundo mostra só os de GPS. Se aparecer GPSLatitude com um valor, sua página está publicando onde a foto foi tirada. No Windows, as propriedades do arquivo, na aba de detalhes, também mostram latitude e longitude quando existem.

Como limpar no upload passo a passo

  1. Receba o arquivo numa área temporária, fora da pasta pública, com limite de tamanho. O post upload de arquivo em PHP cobre limites e pasta, e a lógica vale para qualquer linguagem.
  2. Decodifique e regrave a imagem com uma biblioteca de processamento. Regravar descarta metadados e também neutraliza arquivo disfarçado, como explica arquivo enviado vira imagem de novo.
  3. Aplique a orientação antes de descartar o EXIF. Celular costuma salvar a foto "deitada" e anotar no EXIF que ela deve ser girada. Se você apaga o metadado sem girar os pixels, a foto aparece de lado.
  4. Redimensione para o tamanho que você exibe. Ninguém precisa do arquivo de 12 megapixels no anúncio.
  5. Grave o resultado com nome gerado por você e publique só ele.
  6. Decida sobre o original. Se não há motivo para guardar, apague. Se há, guarde em armazenamento privado, sem URL pública, com prazo de retenção.

Exemplo em Node.js com sharp

const sharp = require('sharp');
const crypto = require('crypto');
const path = require('path');
const fs = require('fs/promises');

const PASTA_PUBLICA = '/srv/marketplace/public/fotos';

async function publicarFoto(caminhoTemporario) {
  const nome = crypto.randomUUID() + '.jpg';
  const destino = path.join(PASTA_PUBLICA, nome);
  try {
    await sharp(caminhoTemporario)
      .rotate()
      .resize({ width: 1600, height: 1600, fit: 'inside', withoutEnlargement: true })
      .jpeg({ quality: 82 })
      .toFile(destino);
    return nome;
  } finally {
    await fs.rm(caminhoTemporario, { force: true });
  }
}

O rotate() sem argumento lê a orientação do EXIF e gira os pixels de acordo. Por padrão, o sharp não copia os metadados da entrada para a saída; eles só são preservados se você pedir explicitamente com as opções de manter metadados. Por isso o código não chama nenhuma delas. O finally apaga o arquivo temporário mesmo se a conversão falhar, para o original não ficar esquecido numa pasta.

Se o seu sistema precisa aceitar HEIC, o formato padrão de fotos do iPhone, confirme se a instalação da biblioteca no seu servidor decodifica esse formato. Isso varia conforme o build. Teste com um arquivo real antes de anunciar o suporte.

Conferindo o resultado

exiftool -gps:all /srv/marketplace/public/fotos/3f2a9c1e-0b7d-4e55-9a0e-6c1d2b8f4a10.jpg

Saída vazia é o que você quer. Inclua esse teste na sua suíte: envie pelo fluxo de upload uma foto de exemplo com GPS conhecido e verifique que o arquivo publicado não tem nenhum campo de GPS.

E as fotos que já estão publicadas

Corrigir o upload não limpa o passado. Para o acervo existente, primeiro descubra o tamanho do problema listando os arquivos que têm latitude:

exiftool -r -if '$gpslatitude' -filename /srv/marketplace/public/fotos

Depois, com backup feito, remova os metadados em lote:

exiftool -r -all= -overwrite_original /srv/marketplace/public/fotos

O -all= apaga todos os metadados que a ferramenta consegue escrever, e o -overwrite_original evita que ela deixe uma cópia com sufixo _original ao lado de cada arquivo, cópia que ainda teria o GPS. Atenção: apagar todos os metadados também remove a tag de orientação, e algumas fotos podem passar a aparecer giradas. Para o acervo, o caminho mais seguro costuma ser reprocessar cada arquivo pela mesma função do upload.

Lembre ainda das cópias que você não vê: CDN com cache, backups e miniaturas geradas antes da correção. Invalide o cache da CDN depois da limpeza, ou a versão antiga continua sendo servida.

Erros comuns

  • Servir o arquivo enviado direto da pasta de upload. Cada foto publicada carrega o que a câmera gravou, inclusive a localização.
  • Apagar o EXIF sem aplicar a rotação. Metade das fotos de celular aparece deitada e o time conclui que "limpar quebra a imagem".
  • Limpar só a versão grande. A miniatura gerada a partir do original, por outra rotina, continua com os metadados.
  • Usar exiftool sem -overwrite_original na pasta pública. Os arquivos com sufixo _original ficam acessíveis pela mesma URL base.
  • Confiar no aviso ao usuário. Pedir que a pessoa desligue o GPS da câmera é bom, mas não substitui a limpeza no servidor.

Checklist

  • Nenhuma imagem pública é o arquivo original enviado.
  • O processamento aplica a orientação antes de descartar os metadados.
  • O fluxo de upload tem um teste automático que confere a ausência de GPS.
  • Miniaturas e versões responsivas saem da imagem já limpa.
  • Originais guardados ficam em armazenamento privado, com prazo para apagar.
  • O acervo antigo foi verificado e reprocessado, e o cache da CDN invalidado.

Baixe agora uma foto enviada por usuário no seu site e rode exiftool -gps:all nela: aparece alguma coordenada?

Avalie este artigo

Referência: https://developer.mozilla.org/docs/Web/Media/Formats/Image_types