Sikkerhet
Sikkerhetsmodellen vår i én setning: det er ingenting på en server å angripe. Alt nedenfor kan falsifiseres fra dine DevTools.
Arkitektur
Abundera QR er en statisk enkeltsideapplikasjon som betjenes fra Cloudflare Pages. Det finnes ingen applikasjonsserver, ingen database, ingen brukerkontoer, ingen autentisering, ingen API-endepunkter og ingen backend-kodesti som behandler brukerdata. Alle QR-genererings-, kodnings-, skannings- og renderingsoperasjoner kjører utelukkende i nettleseren din.
Trusselmodell
Fordi vi ikke samler inn, lagrer eller overfører brukerdata, gjelder ikke de vanligste web-app-truslene — tyveri av legitimasjon, databasebrudd, sesjonskapring, server-side-injeksjon. Den gjenværende angrepsflaten er den statiske ressurspakken (HTML, CSS, JavaScript) som betjenes fra vår opprinnelse. Vi designer med forutsetning om:
- Kompromittering av opprinnelsen: en angriper erstatter en av våre medfølgende ressurser med en ondsinnet. CSP nedenfor begrenser skadeomfanget; cache-buster-tokens gjør det enkelt å rulle tilbake til en kjent god versjon.
- Brukerlevert input: QR-nyttelaster, vCard-navn, WiFi-passord, batch-CSV-rader, skannede bildeinnhold. Alle inputstier behandles som upålitelige når de gjengis tilbake til DOM-en.
- Brukerleverte bilder: vCard-foto-URL-er og logo-opplastinger. Bilder gjengis til et canvas, aldri innebygd i DOM-en som rå markup.
- Tredjeparts nettleserutvidelser: utenfor scope. Hvis en utvidelse i nettleseren din har tillatelse til å endre alle sider, kan den endre vår. Garantiene våre gjelder når siden lastes inn uendret.
Content Security Policy — per direktiv
Gjeldende policy (verifiser i svarheadere for enhver forespørsel):
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'Hva hvert direktiv lar oss gjøre og hvor det kompromitterer:
default-src 'self'— det harde gulvet. Alt vi ikke eksplisitt lemper på, forblir same-origin.script-src 'self' 'wasm-unsafe-eval'— ingen inline<script>, ingeneval().'wasm-unsafe-eval'er nødvendig for QR-enkodningsbiblioteketts WebAssembly-kompileringssti; det tillater IKKE tradisjonelleval(). Vår egen pre-deploy-sjekk skanner alle HTML-sider for inline-skript og feiler bygget.style-src 'self' 'unsafe-inline'— en reell innrømmelse. QR-forhåndsvisningen vår beregner farger på pikselnivå inline (style-attributter på individuelle moduler). En hash-basert tillatelseliste ville fungert, men ville feile ved enhver stiloppdatering uten en deploy. Avveiing: vi aksepterer den litt svakere stilpolicyen; styling kan uansett ikke eksfiltrere data (CSS har ingenconnect-src-rekkevidde).img-src 'self' data: blob: https:—data:for inline QR-gjengivelser,blob:for eksport-nedlastings-URL-er,https:for brukerleverte vCard-foto-URL-er. Brukerleverte URL-er kjøres aldri, de gjengis bare.connect-src 'self' https:— fetch() er begrenset til vår opprinnelse pluss brukerinitiierte HTTPS-hentinger (f.eks. skanning av en foto-URL). Forhindrer eksfiltrering via DNS / WebSocket / beacon til vilkårlige verter.frame-ancestors 'none'— ingen annen side kan bygge oss inn. Forhindrer clickjacking.base-uri 'self'— et ondsinnet injisert<base>-tag kan ikke omdirigere relative URL-er til en angripers opprinnelse.form-action 'self'— ethvert injisert skjema kan bare sende tilbake til vår opprinnelse. Vi har ingen skjemaer som sender data server-side; dette er ekstra sikkerhet.
Ulike CSP-policyer gjelder for /bio/* (lempet img-src for brukerleverte avatarer) og /embed/* (lempet frame-ancestors for intensjonell innebygging). Begge er dokumentert i site/_headers.
Transport + framing-headere
- HSTS:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload— 1 år, alle underdomener, kvalifisert for HSTS-forhåndsinnlastingslisten. Nedgraderinger til HTTP avvises av konformante nettlesere. - X-Frame-Options: DENY — redundant med CSP
frame-ancestors, beholdt for eldre nettleserstøtte. - X-Content-Type-Options: nosniff — forhindrer MIME-forvirringsa ngrep.
- Referrer-Policy: strict-origin-when-cross-origin — utgående lenkeklikk lekker opprinnelsen men ikke stien.
- Permissions-Policy:
camera=(self), microphone=(), geolocation=()— kamera tillatt kun for vår egen skanner; mikrofon og posisjon eksplisitt avvist selv om innebygd.
Service worker
Service workeren vår (site/sw.js) cacher bare same-origin-ressurser. Fetch-handleren avviser eksplisitt cross-origin-forespørsler og ikke-GET-metoder — du kan lese logikken på GitHub. Cache-skrivinger er pakket inn i event.waitUntil() slik at de ikke kan droppes midt i en navigasjon.
Input-sanitering
Alle renderingsstier som aksepterer brukerinput, behandler det som upålitelig tekst:
- QR-nyttelastforhåndsvisninger bruker
textContent, ikkeinnerHTML. - Delingsmål (utklippstavle,
navigator.share()) sender brukertekst som en streng, aldri som markup. - SVG-eksporter genereres fra enkodningsbiblioteket vårt; brukerinnhold er base64-kodet inn i
<image>xlink:href, ikke injisert som SVG-elementer. - Utskriftsforhåndsvisninger bruker en blob-URL, ikke
document.write(). - localStorage-parsing er pakket inn i
try/catch— en korrupt oppføring gir en frisk tom standard, aldri et unntak som kunne rulle inn i en aktiv kodesti. - Brukerleverte URL-er vist som "Åpne lenke"-knapper er begrenset til
http(s)://—javascript:- ogdata:-skjemaer avvises.
Cross-origin bildehenging
Når en bruker limer inn en https:-URL som et vCard-foto eller logo, henter nettleseren det underlagt CORS og vår CSPs img-src-tillatelsesliste. Bildet gjengis til et canvas. Det blir aldri levende DOM, kjører aldri som kode, og når aldri vår opprinnelse — hentingen er nettleser → eksternt bilde, og resultatet males klientsiden. En angriper som kontrollerer en ekstern bilde-URL kan spore at URL-en ble lastet (en loggpost på deres egen server), men kan ikke eksfiltrere noe fra siden vår.
Subresource Integrity (SRI)
All JavaScript og CSS vi leverer er same-origin. Vi laster ikke inn tredjeparts skript eller stilark, så SRI-hasher er ikke relevante. Hvis vi noen gang laster inn en tredjeparts ressurs, legger vi ved en SRI integrity-attributt og dokumenterer hash-oppdateringsprosessen på denne siden.
Rapportere en sårbarhet
Hvis du oppdager et sikkerhetsproblem som påvirker Abundera QR — enten i koden vår, vår distribusjon eller i en avhengighet vi leverer — vennligst rapporter det privat til security@abundera.ai. Vi sikter mot å triagere innen 72 timer. Du kan også nå oss via kontaktdetaljene i vår /.well-known/security.txt-fil.
Ingen bug-bounty (ennå)
Vi tilbyr for øyeblikket ikke betalte bounties, men hver bekreftet gyldig rapport får kredit i endringsloggen og vår offentlige takk.
Verifiser alt ovenfor
Hvert krav på denne siden kan falsifiseres fra nettleserens DevTools uten å stole på oss:
- CSP: DevTools → Nettverk →
/→ Headere. LesContent-Security-Policy-svarheaderen. - HSTS + sikkerhedsheadere: samme sted — alle
Strict-Transport-Security,X-Frame-Optionsosv. er synlige. - Ingen utgående kall: DevTools → Nettverk → Fetch/XHR. Generer en QR. Se antallet forbli null.
- Service worker-scope: DevTools → Applikasjon → Service Workers. Verifiser skriptkilden og den cachede ressurslisten.
- Ingen informasjonskapsler: DevTools → Applikasjon → Cookies. Tom.
- Fullstendig gjennomgang: manifestets verifikasjonsseksjon.
Kontakt
Sikkerhetsrapporter: security@abundera.ai