Sicurezza

Il nostro modello di sicurezza in una frase: non c'è nulla su un server da attaccare. Tutto ciò che segue è verificabile dai tuoi DevTools.

Architettura

Il generatore è un'applicazione a pagina singola statica distribuita da Cloudflare Pages: nessun account utente, nessuna autenticazione e nessun percorso di codice backend in nessun punto del flusso di generazione. Ogni operazione di generazione, codifica, scansione e rendering QR viene eseguita interamente nel tuo browser. Un piccolo endpoint serverless affianca il generatore ed è elencato qui invece di essere nascosto: /api/contact (il modulo di contatto, che archivia quanto invii in Cloudflare D1 e ce lo invia via email). Non viene chiamato mentre crei un codice QR; il controllo di sicurezza URL è un prodotto separato su check.qr.abundera.ai. Verifica se un codice QR è sicuro

Modello di minaccia

Poiché il generatore non raccoglie, archivia o trasmette dati utente (i due endpoint sopra gestiscono solo ciò che invii loro esplicitamente), le minacce più comuni alle app web, furto di credenziali, violazione del database, hijacking di sessione, iniezione lato server, non si applicano a esso. La superficie di attacco residua è il bundle di asset statici (HTML, CSS, JavaScript) distribuito dalla nostra origine. Progettiamo assumendo:

Content Security Policy, per direttiva

La policy qui sotto viene letta dal file _headers effettivamente distribuito al momento della build di questa pagina, quindi non può divergere da ciò che invia l'edge. Verificala nelle intestazioni di risposta di qualsiasi richiesta.

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'

Cosa permette ogni direttiva e dove scende a compromessi:

Cosa non può fare la CSP

La CSP limita da dove il browser può caricare codice. Non verifica cosa fa il codice caricato. Se la nostra origine fosse compromessa, il primo punto del modello di minaccia, lo script dell'attaccante verrebbe eseguito con gli stessi permessi dei nostri, incluse le concessioni connect-src e img-src sopra. Le nostre difese contro questo scenario si collocano a monte della CSP: i deploy escono attraverso un unico account Cloudflare con token con ambito limitato, i nomi dei file degli asset sono hashati in base al contenuto quindi un file sostituito cambia ogni URL che lo referenzia, e il service worker mette in cache solo risposte GET same-origin. Il manifesto descrive il sito così com'è distribuito. Non è un'affermazione che nessuna pagina web potrebbe mai inviare dati da qualche parte, e preferiamo che tu ci giudichi sull'affermazione più ristretta e verificabile.

Policy CSP diverse si applicano a /bio/* (img-src rilassato per avatar forniti dall'utente) e /embed/* (frame-ancestors rilassato per embedding intenzionale). Entrambe sono documentate in site/_headers.

Intestazioni di trasporto e framing

Service worker

Il nostro service worker (site/sw.js) memorizza nella cache solo gli asset same-origin. Il gestore fetch rifiuta esplicitamente le richieste cross-origin e i metodi non-GET, puoi leggere la logica in /sw.js (il sorgente è distribuito abbastanza non minificato da poter essere seguito). Le scritture in cache sono avvolte in event.waitUntil() in modo che non possano essere interrotte a metà navigazione.

Sanificazione dell'input

Ogni percorso di rendering che accetta input utente lo tratta come testo non attendibile:

Recupero di immagini cross-origin

Quando un utente incolla un URL https: come foto vCard o logo, il browser lo recupera soggetto a CORS e alla allowlist img-src del nostro CSP. L'immagine viene renderizzata in un canvas. Non diventa mai DOM attivo, non viene mai eseguita come codice e non raggiunge mai la nostra origine, il fetch è browser → immagine remota, e il risultato viene disegnato lato client. Un attaccante che controlla un URL di immagine remota può tracciare che l'URL è stato caricato (una riga di log sul proprio server) ma non può esfiltrare nulla dalla nostra pagina.

Subresource Integrity (SRI)

Tutto il JavaScript e il CSS che distribuiamo è same-origin. Non carichiamo script o fogli di stile di terze parti, quindi gli hash SRI non sono applicabili. Se mai caricheremo un asset di terze parti, includeremo un attributo SRI integrity su di esso e documenteremo il processo di aggiornamento dell'hash in questa pagina.

Segnalare una vulnerabilità

Se scopri un problema di sicurezza che interessa Abundera QR, nel nostro codice, nel nostro deployment o in una dipendenza che distribuiamo, ti preghiamo di segnalarlo privatamente a security@abundera.ai. Puntiamo a fare triage entro 72 ore. Puoi anche contattarci tramite i dettagli di contatto nel nostro file /.well-known/security.txt.

Nessun bug bounty (ancora)

Al momento non offriamo premi in denaro, ma ogni segnalazione valida confermata riceve credito nel changelog e il nostro ringraziamento pubblico.

Verifica quanto sopra

Ogni affermazione in questa pagina è verificabile dai DevTools del tuo browser senza doversi fidare di noi:

Contatto

Segnalazioni di sicurezza: security@abundera.ai

Ultimo aggiornamento: 2026-09-03. Prossima revisione: 2026-12-03.