De applicatie stuurt geen Content-Security-Policy header. Zonder CSP kan een eventuele XSS vrijwel ongehinderd scripts uitvoeren in de browser.
https://app.acme.example/
Verhoogt de impact van elke XSS-kwetsbaarheid aanzienlijk en maakt supply-chain risico (bijv. een gekaapt third-party script) moeilijker te beperken.
Voeg een Content-Security-Policy header toe, te beginnen met een strikte basis zoals: `default-src 'self'; script-src 'self'; frame-ancestors 'none'; base-uri 'self'`. Breid uit op basis van wat je daadwerkelijk nodig hebt en test stap voor stap met `Content-Security-Policy-Report-Only`.
De cookie ziet er uit als een sessiecookie maar kan door JavaScript worden uitgelezen. Een XSS kan daardoor direct de sessie overnemen.
https://app.acme.example/
Een XSS-kwetsbaarheid wordt vrijwel gelijk aan een volledige accountovername voor ingelogde gebruikers.
Zet HttpOnly op alle session-/auth-cookies. Frontend code moet nooit direct bij het session token kunnen.
De zoek-knop in de topbar heeft geen toegankelijke naam. Schermlezer-gebruikers horen alleen "button".
https://app.acme.example/ → header > button.icon-search
Icon-only knoppen zonder aria-label zijn onbruikbaar voor blinde of slechtziende gebruikers.
Voeg aria-label="Zoek" toe aan de knop, of geef hem een verborgen tekstlabel.
<button aria-label="Zoek"> <SearchIcon aria-hidden="true" /> </button>
De <html> tag heeft geen lang-attribuut.
https://app.acme.example/ → html
Gebruikers van schermlezers horen woorden met de verkeerde uitspraakregels.
Voeg <html lang="nl"> (of de juiste taalcode) toe in je root layout.
De webhook-configuratiepagina toont een http://-URL als voorbeeld. Klanten kopiëren zulke voorbeelden makkelijk naar productie.
https://app.acme.example/settings/webhooks
Event-payloads kunnen ongewenst via HTTP lekken.
Gebruik alleen HTTPS-voorbeelden en valideer het protocol server-side.