Seguridad

Nuestro modelo de seguridad en una frase: no hay nada en un servidor que atacar. Todo lo que aparece a continuación es verificable desde tus DevTools.

Arquitectura

Abundera QR es una aplicación de página única estática servida desde Cloudflare Pages. No hay servidor de aplicaciones, ni base de datos, ni cuentas de usuario, ni autenticación, ni endpoints de API, ni código de backend que procese datos de usuario. Cada operación de generación, codificación, escaneo y renderizado de QR se ejecuta completamente dentro de tu navegador.

Modelo de amenaza

Dado que no recopilamos, almacenamos ni transmitimos datos de usuario, las amenazas más comunes en aplicaciones web — robo de credenciales, brecha de base de datos, secuestro de sesión, inyección del lado del servidor — no se aplican. La superficie de ataque restante es el paquete de activos estáticos (HTML, CSS, JavaScript) servido desde nuestro origen. Diseñamos asumiendo:

Política de Seguridad de Contenido — por directiva

La política actual (verifica en los encabezados de respuesta de cualquier solicitud):

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

Qué permite cada directiva y dónde implica concesiones:

Se aplican diferentes políticas CSP a /bio/* (relajación de img-src para avatares suministrados por el usuario) y /embed/* (relajación de frame-ancestors para incrustación intencional). Ambas están documentadas en site/_headers.

Encabezados de transporte y marcos

Service worker

Nuestro service worker (site/sw.js) almacena en caché solo activos del mismo origen. El controlador de fetch rechaza explícitamente las solicitudes de origen cruzado y los métodos que no son GET — puedes leer la lógica en GitHub. Las escrituras en caché están envueltas en event.waitUntil() para que no puedan descartarse en medio de una navegación.

Sanitización de entradas

Cada ruta de renderizado que acepta entrada de usuario la trata como texto no confiable:

Obtención de imágenes de origen cruzado

Cuando un usuario pega una URL https: como foto de vCard o logotipo, el navegador la obtiene sujeto a CORS y la lista de permitidos img-src de nuestro CSP. La imagen se renderiza en un canvas. Nunca se convierte en DOM activo, nunca se ejecuta como código y nunca llega a nuestro origen — la obtención es navegador → imagen remota, y el resultado se pinta en el lado del cliente. Un atacante que controla una URL de imagen remota puede rastrear que la URL fue cargada (una línea de registro en su propio servidor), pero no puede filtrar nada de nuestra página.

Integridad de Subrecursos (SRI)

Todo el JavaScript y CSS que enviamos es del mismo origen. No cargamos scripts ni hojas de estilo de terceros, por lo que los hashes SRI no son aplicables. Si alguna vez cargamos un activo de terceros, incluiremos un atributo integrity SRI en él y documentaremos el proceso de actualización de hash en esta página.

Reportar una vulnerabilidad

Si descubres un problema de seguridad que afecta a Abundera QR — ya sea en nuestro código, nuestro despliegue o en una dependencia que enviamos — por favor repórtalo de forma privada a security@abundera.ai. Nuestro objetivo es triagiar en 72 horas. También puedes contactarnos a través de los detalles de contacto en nuestro archivo /.well-known/security.txt.

Sin programa de recompensas (por ahora)

Actualmente no ofrecemos recompensas pagadas, pero cada informe válido confirmado recibe crédito en el registro de cambios y nuestro agradecimiento público.

Verifica cualquiera de lo anterior

Cada afirmación en esta página es verificable desde los DevTools de tu navegador sin necesidad de confiarnos:

Contacto

Divulgaciones de seguridad: security@abundera.ai

Última actualización: 2026-04-19. Próxima revisión: 2026-07-19.