Segurança

Nosso modelo de segurança em uma frase: não há nada em um servidor para atacar. Tudo abaixo é verificável a partir das suas DevTools.

Arquitetura

O gerador é uma aplicação de página única estática servida a partir do Cloudflare Pages: sem contas de usuário, sem autenticação e nenhum caminho de código de backend em nenhum ponto do fluxo de geração. Toda operação de geração, codificação, leitura e renderização de QR é executada inteiramente dentro do seu navegador. Um pequeno endpoint serverless existe ao lado disso e está listado aqui em vez de escondido: /api/contact (o formulário de contato, que armazena o que você envia no Cloudflare D1 e nos envia por e-mail). Ele não é chamado enquanto você cria um código QR; o verificador de segurança de URL é um produto separado em check.qr.abundera.ai. Verificar se um código QR é seguro

Modelo de ameaça

Como o gerador não coleta, armazena nem transmite dados de usuário (os dois endpoints acima tratam apenas do que você envia explicitamente a eles), as ameaças mais comuns em aplicações web — roubo de credenciais, violação de banco de dados, sequestro de sessão, injeção no lado do servidor — não se aplicam a ele. A superfície de ataque restante é o bundle de assets estáticos (HTML, CSS, JavaScript) servido de nossa origem. Projetamos assumindo:

Política de Segurança de Conteúdo — por diretiva

A política abaixo é lida do arquivo _headers implantado no momento em que esta página é gerada, então não pode divergir do que a borda envia. Verifique-a nos cabeçalhos de resposta de qualquer requisição.

Content-Security-Policy:
  default-src 'self';
  script-src 'self' https://abundera.ai 'wasm-unsafe-eval' https://challenges.cloudflare.com;
  worker-src 'self' blob:;
  style-src 'self' 'unsafe-inline' https://abundera.ai;
  font-src 'self';
  img-src 'self' data: blob: https:;
  connect-src 'self' https: https://challenges.cloudflare.com;
  frame-src 'self' https://challenges.cloudflare.com;
  frame-ancestors 'none';
  base-uri 'self';
  form-action 'self'

O que cada diretiva nos permite fazer e onde ela representa um compromisso:

O que o CSP não pode fazer

O CSP limita de onde o navegador vai carregar código. Ele não avalia o que o código carregado faz. Se a nossa origem fosse comprometida, o primeiro item do modelo de ameaça, o script do atacante rodaria com as mesmas permissões que o nosso, incluindo as permissões de connect-src e img-src acima. As nossas defesas contra isso ficam a montante do CSP: os deploys saem por uma única conta Cloudflare com tokens de escopo limitado, os nomes de arquivo dos assets têm hash de conteúdo, então um arquivo trocado muda toda URL que o referencia, e o service worker faz cache apenas de respostas GET da mesma origem. O manifesto descreve o site como ele é entregue. Não é uma afirmação de que nenhuma página web jamais poderia enviar dados para algum lugar, e preferimos que você nos cobre pela afirmação mais restrita e verificável.

Políticas CSP diferentes se aplicam a /bio/* (img-src relaxado para avatares fornecidos pelo usuário) e /embed/* (frame-ancestors relaxado para incorporação intencional). Ambas estão documentadas em site/_headers.

Cabeçalhos de transporte e enquadramento

Service worker

Nosso service worker (site/sw.js) armazena em cache apenas assets da mesma origem. O handler de fetch rejeita explicitamente requisições de origem cruzada e métodos não-GET — você pode ler a lógica em /sw.js (o código é enviado suficientemente não minificado para acompanhar). Escritas em cache são envolvidas em event.waitUntil() para que não possam ser descartadas no meio de uma navegação.

Sanitização de entradas

Todo caminho de renderização que aceita entrada do usuário a trata como texto não confiável:

Busca de imagens de origem cruzada

Quando um usuário cola uma URL https: como foto de vCard ou logotipo, o navegador a busca sujeito ao CORS e à lista de permissões img-src do nosso CSP. A imagem é renderizada em um canvas. Ela nunca se torna DOM ativo, nunca é executada como código e nunca chega à nossa origem — a busca é navegador → imagem remota, e o resultado é pintado no lado do cliente. Um atacante que controla uma URL de imagem remota pode rastrear que a URL foi carregada (uma linha de log em seu próprio servidor), mas não consegue exfiltrar nada da nossa página.

Integridade de Sub-Recursos (SRI)

Todo JavaScript e CSS que entregamos é da mesma origem. Não carregamos scripts ou folhas de estilo de terceiros, portanto os hashes SRI não são aplicáveis. Se algum dia carregarmos um asset de terceiros, incluiremos um atributo integrity SRI nele e documentaremos o processo de atualização de hash nesta página.

Reportar uma vulnerabilidade

Se você descobrir um problema de segurança afetando o Abundera QR — seja no nosso código, nossa implantação ou em uma dependência que entregamos — por favor, reporte-o de forma privada para security@abundera.ai. Buscamos fazer a triagem em 72 horas. Você também pode nos contatar através dos detalhes de contato no nosso arquivo /.well-known/security.txt.

Sem programa de bug bounty (ainda)

Atualmente não oferecemos recompensas pagas, mas cada relatório válido confirmado recebe crédito no changelog e nosso agradecimento público.

Verifique qualquer uma das afirmações acima

Cada afirmação nesta página é falsificável a partir das DevTools do seu navegador sem precisar confiar em nós:

Contato

Divulgações de segurança: security@abundera.ai

Última atualização: 2026-09-03. Próxima revisão: 2026-12-03.