Beveiliging

Ons beveiligingsmodel in één zin: er is niets op een server om aan te vallen. Alles hieronder is verifieerbaar vanuit je DevTools.

Architectuur

De generator is een statische single-page applicatie geserveerd vanuit Cloudflare Pages: geen gebruikersaccounts, geen authenticatie en nergens in de generatiestroom een backend-codepad. Elke QR-generatie, -codering, -scan en -renderingoperatie wordt volledig in je browser uitgevoerd. Eén klein serverless endpoint staat ernaast en wordt hier vermeld in plaats van verborgen: /api/contact (het contactformulier, dat wat je indient opslaat in Cloudflare D1 en naar ons e-mailt). Het wordt niet aangeroepen terwijl je een QR-code maakt; de URL-veiligheidscheck is een apart product op check.qr.abundera.ai. Controleer of een QR-code veilig is

Dreigingsmodel

Omdat de generator geen gebruikersdata verzamelt, opslaat of verzendt (de twee endpoints hierboven verwerken alleen wat je er expliciet naartoe stuurt), zijn de meest voorkomende webapp-bedreigingen, diefstal van inloggegevens, databaseinbreuk, sessie-hijacking, server-side injectie, niet op de generator van toepassing. Het resterende aanvalsoppervlak is de statische asset-bundel (HTML, CSS, JavaScript) die vanuit onze origin wordt geserveerd. We ontwerpen met de aanname:

Content Security Policy, per directive

Het onderstaande beleid wordt bij het bouwen van deze pagina gelezen uit het uitgeleverde _headers-bestand, zodat het niet kan afwijken van wat de edge daadwerkelijk verstuurt. Verifieer het in de responsheaders van elk verzoek.

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'

Wat elke directive ons toestaat en waar het compromissen biedt:

Wat CSP niet kan

CSP beperkt van waar de browser code laadt. Het controleert niet wat geladen code doet. Als onze origin gecompromitteerd zou zijn, het eerste punt in het dreigingsmodel, zou het script van de aanvaller draaien met dezelfde rechten als de onze, inclusief de connect-src- en img-src-toestemmingen hierboven. Onze verdediging daartegen zit stroomopwaarts van CSP: deploys gaan via één Cloudflare-account met scoped tokens, asset-bestandsnamen zijn content-hashed zodat een vervangen bestand elke URL verandert die ernaar verwijst, en de service worker cachet alleen same-origin GET-responses. Het manifest beschrijft de site zoals die wordt uitgeleverd. Het is geen bewering dat geen enkele webpagina ooit ergens data naartoe zou kunnen sturen, en we willen liever dat je ons aan de nauwere, controleerbare uitspraak houdt.

Verschillende CSP-beleidsregels zijn van toepassing op /bio/* (versoepelde img-src voor door gebruikers opgegeven avatars) en /embed/* (versoepelde frame-ancestors voor opzettelijk insluiten). Beide zijn gedocumenteerd in site/_headers.

Transport- en framing-headers

Service worker

Onze service worker (site/sw.js) slaat alleen same-origin-assets in de cache op. De fetch-handler weigert expliciet cross-origin-verzoeken en niet-GET-methoden, je kunt de logica lezen in /sw.js (de broncode wordt zonder sterke minificatie uitgeleverd, genoeg om te volgen). Cache-schrijfbewerkingen zijn gewikkeld in event.waitUntil() zodat ze niet halverwege een navigatie kunnen worden verwijderd.

Invoersanitisatie

Elk renderingpad dat gebruikersinvoer accepteert, behandelt dit als niet-vertrouwde tekst:

Cross-origin afbeeldingen ophalen

Wanneer een gebruiker een https:-URL plakt als vCard-foto of logo, haalt de browser deze op via CORS en de img-src-allowlist van onze CSP. De afbeelding wordt in een canvas gerenderd. Het wordt nooit live DOM, wordt nooit uitgevoerd als code en bereikt nooit onze origin, de fetch is browser → externe afbeelding en het resultaat wordt client-side geschilderd. Een aanvaller die een externe afbeeldings-URL beheert, kan bijhouden dat de URL is geladen (een logregel op hun eigen server), maar kan niets van onze pagina exfiltreren.

Subresource Integrity (SRI)

Alle JavaScript en CSS die we leveren is same-origin. We laden geen scripts of stylesheets van derden, dus SRI-hashes zijn niet van toepassing. Als we ooit een asset van een derde partij laden, zullen we een SRI integrity-attribuut eraan toevoegen en het hash-updateproces op deze pagina documenteren.

Een kwetsbaarheid melden

Als je een beveiligingsprobleem ontdekt dat Abundera QR treft, of het nu in onze code, onze implementatie of in een afhankelijkheid die we leveren zit, meld het dan privé aan security@abundera.ai. We streven ernaar binnen 72 uur te triageren. Je kunt ons ook bereiken via de contactgegevens in ons /.well-known/security.txt-bestand.

Nog geen bugbounty

We bieden momenteel geen betaalde bounties aan, maar elk bevestigd geldig rapport ontvangt erkenning in de changelog en onze publieke dankbaarheid.

Verifieer het bovenstaande

Elke bewering op deze pagina is verifieerbaar vanuit de DevTools van je browser zonder ons te vertrouwen:

Contact

Beveiligingsmededelingen: security@abundera.ai

Laatst bijgewerkt: 2026-09-03. Volgende beoordeling: 2026-12-03.