Sikkerhed
Vores sikkerhedsmodel i én sætning: der er intet på en server at angribe. Alt herunder kan falsificeres fra dine DevTools.
Arkitektur
Abundera QR er en statisk single-page-applikation, der serveres fra Cloudflare Pages. Der er ingen applikationsserver, ingen database, ingen brugerkonti, ingen godkendelse, ingen API-endepunkter og ingen backend-kodesti, der behandler brugerdata. Alle QR-genererings-, kodnings-, scannings- og renderingsoperationer kører udelukkende i din browser.
Trusselsmodel
Fordi vi ikke indsamler, gemmer eller transmitterer brugerdata, gælder de mest almindelige webapptrusler — tyveri af legitimationsoplysninger, databasebrud, session-kapring, serverside-injektion — ikke. Den resterende angrebsflade er det statiske asset-bundt (HTML, CSS, JavaScript), der serveres fra vores oprindelse. Vi designer med antagelsen om:
- Kompromittering af oprindelsen: en angriber erstatter et af vores medfølgende assets med et ondsindet. CSP nedenfor begrænser skadeomfanget; cache-buster-tokens gør det nemt at rulle tilbage til en kendt god version.
- Brugerleveret input: QR-nyttelaster, vCard-navne, WiFi-adgangskoder, batch-CSV-rækker, scannede billedindhold. Alle inputstier behandles som upålidelige, når de gengives tilbage til DOM'en.
- Brugerleverede billeder: vCard-foto-URL'er og logo-uploads. Billeder gengives til et canvas, aldrig indlejret i DOM'en som rå markup.
- Tredjeparts browserudvidelser: uden for scope. Hvis en udvidelse i din browser har tilladelse til at ændre alle sider, kan den ændre vores. Vores garantier gælder, når siden indlæses uændret.
Content Security Policy — pr. direktiv
Den aktuelle politik (verificer i svarheadere for enhver anmodning):
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'Hvad hvert direktiv lader os gøre, og hvor det kompromitterer:
default-src 'self'— det hårde gulv. Alt, vi ikke eksplicit lemper, forbliver same-origin.script-src 'self' 'wasm-unsafe-eval'— ingen inline<script>, ingeneval().'wasm-unsafe-eval'er nødvendig for vores QR-enkodningsbiblioteks WebAssembly-kompileringssti; det tillader IKKE traditioneleval(). Vores egen pre-deploy-kontrol scanner alle HTML-sider for inline-scripts og fejler bygningen.style-src 'self' 'unsafe-inline'— en reel indrømmelse. Vores QR-forhåndsvisning beregner farver på pixelniveau inline (style-attributter på individuelle moduler). En hash-baseret tilladelsesliste ville virke, men ville fejle ved enhver stilopdatering uden en deploy. Afvejning: vi accepterer den lidt svagere stilpolitik; styling kan alligevel ikke eksfiltrere data (CSS har ingenconnect-src-rækkevidde).img-src 'self' data: blob: https:—data:for inline QR-gengivelser,blob:for eksport-download-URL'er,https:for brugerleverede vCard-foto-URL'er. Brugerleverede URL'er udføres aldrig, de gengives kun.connect-src 'self' https:— fetch() er begrænset til vores oprindelse plus brugerinitierede HTTPS-hentninger (f.eks. scanning af en foto-URL). Forhindrer eksfiltrering via DNS / WebSocket / beacon til vilkårlige hosts.frame-ancestors 'none'— ingen anden side kan indlejre os. Forhindrer clickjacking.base-uri 'self'— et ondsindet injiceret<base>-tag kan ikke omdirigere relative URL'er til en angribers oprindelse.form-action 'self'— enhver injiceret formular kan kun sende tilbage til vores oprindelse. Vi har ingen formularer, der sender data server-side; dette er ekstra sikkerhed.
Forskellige CSP-politikker gælder for /bio/* (lempet img-src for brugerleverede avatarer) og /embed/* (lempet frame-ancestors for intentionel indlejring). Begge er dokumenteret i site/_headers.
Transport + framing-headere
- HSTS:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload— 1 år, alle underdomæner, berettiget til HSTS-forudindlæsningslisten. Nedgraderinger til HTTP afvises af konformante browsere. - X-Frame-Options: DENY — redundant med CSP
frame-ancestors, bevaret for ældre browserunderstøttelse. - X-Content-Type-Options: nosniff — forhindrer MIME-forvirringsangreb.
- Referrer-Policy: strict-origin-when-cross-origin — udgående lænkeklik lækker oprindelsen, men ikke stien.
- Permissions-Policy:
camera=(self), microphone=(), geolocation=()— kamera tilladt kun for vores egen scanner; mikrofon og placering eksplicit afvist, selv hvis indlejret.
Service worker
Vores service worker (site/sw.js) cacher kun same-origin-assets. Fetch-handleren afviser eksplicit cross-origin-anmodninger og ikke-GET-metoder — du kan læse logikken på GitHub. Cache-skrivninger er pakket ind i event.waitUntil(), så de ikke kan droppes midt i en navigation.
Input-sanitering
Alle renderingsstier, der accepterer brugerinput, behandler det som upålidelig tekst:
- QR-nyttelastforhåndsvisninger bruger
textContent, ikkeinnerHTML. - Delingsmål (udklipsholder,
navigator.share()) sender brugertekst som en streng, aldrig som markup. - SVG-eksporter genereres fra vores enkodningsbibliotek; brugerindhold er base64-kodet ind i
<image>xlink:href, ikke injiceret som SVG-elementer. - Udskriftsforhåndsvisninger bruger en blob-URL, ikke
document.write(). - localStorage-parsing er pakket ind i
try/catch— en korrupt post giver et frisk tomt standard, aldrig en undtagelse, der kunne rulle ind i en aktiv kodesti. - Brugerleverede URL'er, der vises som "Åbn link"-knapper, er begrænset til
http(s)://—javascript:- ogdata:-skemaer afvises.
Cross-origin billedhentning
Når en bruger indsætter en https:-URL som et vCard-foto eller logo, henter browseren det under CORS og vores CSPs img-src-tilladelsesliste. Billedet gengives til et canvas. Det bliver aldrig levende DOM, kører aldrig som kode og når aldrig vores oprindelse — hentningen er browser → eksternt billede, og resultatet males klientsiden. En angriber, der kontrollerer en ekstern billed-URL, kan spore, at URL'en blev indlæst (en logpost på deres egen server), men kan ikke eksfiltrere noget fra vores side.
Subresource Integrity (SRI)
Al JavaScript og CSS, vi leverer, er same-origin. Vi indlæser ikke tredjeparts-scripts eller -stylesheets, så SRI-hashes er ikke relevante. Hvis vi nogensinde indlæser et tredjeparts-asset, leverer vi en SRI integrity-attribut på det og dokumenterer hash-opdateringsprocessen på denne side.
Rapportering af en sårbarhed
Hvis du opdager et sikkerhedsproblem, der påvirker Abundera QR — hvad enten det er i vores kode, vores deployment eller i en afhængighed, vi leverer — bedes du rapportere det privat til security@abundera.ai. Vi sigter mod at triagere inden for 72 timer. Du kan også kontakte os via kontaktoplysningerne i vores /.well-known/security.txt-fil.
Ingen bug-bounty (endnu)
Vi tilbyder i øjeblikket ikke betalte bounties, men hver bekræftet gyldig rapport modtager kredit i ændringsloggen og vores offentlige tak.
Verificer alt ovenstående
Hvert udsagn på denne side kan falsificeres fra din browsers DevTools uden at stole på os:
- CSP: DevTools → Netværk →
/→ Headere. LæsContent-Security-Policy-svarheaderen. - HSTS + sikkerhedsheadere: samme sted — alle
Strict-Transport-Security,X-Frame-Optionsosv. er synlige. - Ingen udgående kald: DevTools → Netværk → Fetch/XHR. Generer en QR. Se antallet forblive nul.
- Service worker-scope: DevTools → Applikation → Service Workers. Verificer scriptkilden og den cachede asset-liste.
- Ingen cookies: DevTools → Applikation → Cookies. Tom.
- Fuld gennemgang: manifestets verifikationsafsnit.
Kontakt
Sikkerhedsoplysninger: security@abundera.ai