Skip to main content
Blog
Blog

Wat is CSS-beveiliging? | Phishing en Clickjacking via CSS-aanvallen voorkomen

CSS bepaalt wat gebruikers zien. Aanvallers misbruiken dat. Dit artikel bespreekt CSS-gebaseerde client-side kwetsbaarheden en hoe je je daartegen beschermt.

Dec 23, 2025 12 min read
wat is css-beveiliging - cside

Gebruikersvertrouwen is visueel. Gebruikers kunnen alleen vertrouwen wat ze zien. Het is de browser die deze belofte visueel waarmaakt. Het is CSS dat deze visuele belofte levert. CSS gaat over meer dan alleen styling om pagina's er goed uit te laten zien en je merk te laten opvallen.

CSS levert de UI: wat gebruikers kunnen zien en wat niet. Als je geen waarschuwingspopup ziet, waarom zou je je dan zorgen maken? Wanneer aanvallers bepalen wat er in de browser wordt weergegeven, hebben ze controle over het vertrouwen van gebruikers. Ze kunnen gebruikers misleiden door kwaadaardige CSS te injecteren. Daarom is CSS ook een verborgen aanvalsoppervlak.

In maart 2025 kwamen 150.000 websites er op de harde manier achter. Bezoekers die legitieme sites verwachtten, kregen Chinese gokplatforms te zien. Hoe werd dit gedaan? Aanvallers injecteerden kwaadaardige JavaScript en gebruikten CSS-overlays om echte pagina's te vervangen.

"Elke stylesheet is een potentieel kanaal waarmee de browser externe resources opvraagt. Daarom maken CSS-stylesheets deel uit van de algehele client-side beveiligingshouding."

TL;DR

  • Waarom CSS een beveiligingsrisico is: CSS bepaalt wat gebruikers zien. Als aanvallers een toegangspunt kunnen vinden, kunnen ze nep-UI overlappen om meerstaps-phishingaanvallen uit te voeren.
  • Hoe CSS-gebaseerde aanvallen werken: Eerst verkrijgen aanvallers een injectieroute (vaak via XSS of scripts van derden). Vervolgens kan CSS worden gebruikt om waarschuwingen te onderdrukken, elementen te herpositioneren, inhoud te herschikken of onzichtbare overlays te stapelen voor clickjacking en phishing.
  • Tips om CSS-misbruik te voorkomen: Vergrendel stijlbronnen met CSP, bescherm statische assets met SRI, blokkeer iframe-insluiting en versterk de beveiliging tegen XSS-kwetsbaarheden. Als alternatief kun je een continu monitoringtool zoals cside gebruiken om DOM-wijzigingen in de gaten te houden.

Wat is CSS?

HTML, CSS en JavaScript: wie doet wat?

CSS, een afkorting voor Cascading Style Sheets, bepaalt het uiterlijk van je websitepagina's. Het beheert de visuele laag: randen, uitlijning, kleuren, lettertypen, afstand, grootte en nog veel meer stijlkenmerken.

Het werkt samen met HTML, dat de structuur en inhoud van de pagina bepaalt, en JavaScript, dat het gedrag en de logica verzorgt: klikken afhandelen, foutmeldingen tonen, gegevens verzenden naar of ophalen van een server. HTML definieert bijvoorbeeld <form>, <button> of <input>, CSS kiest kleuren, lay-outs en het lettertype, en JavaScript voegt dynamische eigenschappen toe en de validatie of API van het verzoek.

Waarom CSS belangrijk is voor webbeveiliging

<compare-table data='{ "head_class": "!font-normal !bg-white", "cols": { "css": { "title": "CSS-mogelijkheden" }, "browser": { "title": "Browsergedrag" }, "attack": { "title": "Aanval & Impact" } }, "rows": [ { "css": "url() in background-image, @font-face, iconen", "browser": "Vraagt externe resources op (lettertypen, afbeeldingen, iconen)", "attack": "Aanvaller wijzigt stylesheets of resource-URL'''s" }, { "css": "display: none; visibility: hidden; off-screen inhoud", "browser": "Geeft weer wat zichtbaar of verborgen is, op of buiten het scherm", "attack": "UI gemanipuleerd: waarschuwingen verborgen, toestemmingsbanners geminimaliseerd, knoppen verplaatst" }, { "css": "Knoppen, formulieren, banners opnieuw stijlen", "browser": "Past stijlen toe op DOM-knooppunten aangemaakt door HTML/JS", "attack": "Aanvaller injecteert HTML/JS (XSS, gecompromitteerde assets)" }, { "css": "Overlays, lagen die bovenop liggen", "browser": "Laat geïnjecteerde inhoud er '''native''' uitzien als het overeenkomt met bestaande CSS", "attack": "Bestaande CSS laat kwaadaardige DOM er normaal en betrouwbaar uitzien" } ] }'

Dit is waarom beveiligingsprofessionals aandacht moeten besteden: HTML, JavaScript en CSS draaien in de browser en delen dezelfde oorsprong en vertrouwensgrenzen. Het Document Object Model (DOM) is hier cruciaal. Wanneer een pagina laadt, parseert de browser HTML naar de DOM-boom en CSS naar het CSS Object Model (CSSOM). Het resultaat is een Render Tree die alleen de zichtbare en gestijlde elementen bevat.

JavaScript is ontworpen om de DOM te lezen en te manipuleren: het kan elementen toevoegen, wijzigen, verwijderen en verbergen tijdens runtime.

Alles wat de DOM kan wijzigen, zoals geïnjecteerde HTML of JavaScript, kan de UI wijzigen en wat er op het scherm van de gebruiker wordt weergegeven. Dat creëert kansen en risico's.

Daarom moet CSS-beveiliging beginnen met het voorkomen van DOM-manipulatie: XSS-preventie, CSP en supply chain-beveiliging.

CSS: van visueel ontwerp naar aanvalsoppervlak

In tegenstelling tot JavaScript kan CSS geen code uitvoeren, maar het kan de browser wel instrueren om aanvullende resources te laden, zoals lettertypen, afbeeldingen of iconen, van externe servers. CSS url()-waarden in background-image of @font-face kunnen de browser bijvoorbeeld vertellen die resources op te halen van externe servers.

Elke stylesheet is een potentieel kanaal waarmee de browser externe resources opvraagt, en maakt daarom deel uit van de algehele client-side beveiligingshouding.

Zelfs zonder code uit te voeren, bepaalt CSS wat er wordt weergegeven en wat verborgen blijft met display:none; of visibility:hidden;. Het kan ook inhoud buiten het scherm herpositioneren, zodat gebruikers bepaalde opties of knoppen helemaal niet zien. Het kan knoppen en formulieren verplaatsen en opnieuw stijlen, waarschuwingen en toestemmingsbanners verbergen of visueel minimaliseren, of zelfs lagen toevoegen die veranderen hoe gebruikers met de pagina omgaan.

Als aanvallers kunnen wijzigen welke stylesheets worden geladen of naar welke afbeeldingen, lettertypen of iconen ze verwijzen, kunnen ze beïnvloeden wat gebruikers zien.

Zo wordt CSS onderdeel van je CSS-aanvalsoppervlak en je bredere client-side aanvalsoppervlak, en waarom het moet worden meegenomen in je risicobeheer en -beoordeling. Na een injectiekwetsbaarheid, zoals cross-site scripting, kunnen kwaadwillenden CSS als wapen inzetten.

Hoe CSS gebruikers aanzet tot vertrouwen

Gebruikers vertrouwen wat ze zien als de interface zich gedraagt zoals ze verwachten. Als de UI er vertrouwd uitziet, vertrouwen mensen het proces.

Dat maakt de visuele hiërarchie een UX-ontwerpkwestie. Maar het wordt een beveiligingskwestie wanneer aanvallers een vertrouwd ontwerp manipuleren. Je ontwerpt je "Nu betalen"-knop bijvoorbeeld om op te vallen met duidelijke foutmeldingen die opvallend en leesbaar zijn, niet moeilijk te vinden of gemakkelijk te missen.

Het omgekeerde geldt ook. Slechte lay-outs zijn verwarrend en leiden tot verkeerde klikken of onomkeerbare acties zonder waarschuwing, waardoor het vertrouwen daalt. Goede CSS en doordacht UI-ontwerp moeten verwarrende lay-outs vermijden en verkeerde klikken verminderen. Het moet ondubbelzinnige feedback geven en duidelijke visuele aanwijzingen bieden over wat er gebeurt en wat er van gebruikers wordt verwacht.

"Secure-by-design" UX gebruikt CSS om klanten te ondersteunen en te helpen hun weg in je applicaties vol vertrouwen te vinden. Als gebruikers in de war zijn en niet begrijpen wat er gebeurt of waarom, komen je beveiligingsmaatregelen niet aan.

Gebruikers vertrouwen patronen en aanvallers weten dat: ze injecteren wat CSS, herpositioneren een betaalknop, verbergen een waarschuwing en leggen een nep-betaalformulier erover.

Hoe CSS wordt gebruikt bij clickjacking-aanvallen

hoe-gebruikers-worden-misleid-bij-clickjacking-aanvallen

Negatieve marges kunnen elementen ook buiten het scherm duwen. Een beveiligingswaarschuwing kan uit het zichtbare gebied worden geduwd met .security-warning { margin-top: -9999px; }.

Nog meer trucs om te manipuleren wat gebruikers zien:

  • display: none verwijdert inhoud
  • visibility: hidden verbergt inhoud en behoudt de ruimte
  • overflow: hidden knipt inhoud af die mogelijk waarschuwingen bevat
  • overflow: visible breidt inhoud uit buiten de container en overlapt andere elementen

Voor kritieke stromen zoals inloggen, toestemming of betaling is het noodzakelijk om de afmetingen van elementen in de DOM te controleren en of er iets bovenop is gestapeld of buiten het zicht is geduwd.

CSS-aanvalsingangen: XSS, CDN's, supply chain en widgets

In de meeste gevallen hebben aanvallers eerst een toegangspunt nodig. Zo krijgen ze kwaadaardige CSS op je pagina:

  • XSS-kwetsbaarheid — <style>-tags of inline stijlen injecteren
  • Gecompromitteerde CDN — kwaadaardige CSS geserveerd vanuit een vertrouwde bron
  • Supply chain-aanval — gecompromitteerd npm-pakket, thema of plugin
  • Widgets van derden — chat-, analyse- en A/B-testtools met lay-outcontrole

Deze aanvallen richten zich op verschillende manieren op de browser van de gebruiker.

XSS en widgets van derden injecteren kwaadaardige CSS rechtstreeks in de pagina terwijl deze in de browser van de gebruiker draait.

CDN- en supply chain-aanvallen vergiftigen de CSS aan de bron. CDN-aanvallen vervangen je CSS door kwaadaardige versies op de server. Supply chain-aanvallen smokkelen kwaadaardige CSS in je codebase tijdens de build via een gecompromitteerd npm-pakket of thema's.

UI-misleiding bij op framing gebaseerde aanvallen

Sommige UI-aanvallen, zoals op framing gebaseerde clickjacking, hoeven je CSS helemaal niet te wijzigen. In plaats daarvan lokt de aanvaller de gebruiker naar zijn eigen pagina. Ze sluiten je site in een iframe in en vermommen visueel waarop de gebruiker klikt (UI redressing). Dit werkt alleen als je site kan worden ingesloten in iframes, wat betekent dat er geen CSP frame-ancestors-beperking is en geen X-Frame-Options-header.

SVG Clickjacking

Op framing gebaseerde clickjacking kan veel verder gaan dan de klassieke verborgen knopklik. In december deelde beveiligingsonderzoeker Lyra Rebane een proof of concept die laat zien hoe. In plaats van te vertrouwen op klassieke overlays, laat het op een totaal nieuwe manier SVG-filters en CSS-rendering samenwerken om een interactieve en meerstaps clickjacking-aanval te creëren. De implicaties zijn ernstig: als ingesloten iframes zijn toegestaan, kan zo'n aanval cross-origin gegevens lekken, zoals werd aangetoond met Google Docs-inhoud. Kortom: als je pagina's kunnen worden ingesloten, ga er dan van uit dat aanvallers ze al hebben gevonden.

Onafhankelijk onderzoek dat voortbouwt op SVG clickjacking:

CSS veiliger maken: Voorkomen, Detecteren, Verdedigen

CSS kan niet op zichzelf als wapen worden ingezet. Aanvallers hebben eerst een toegangspunt nodig. Zodra die voet aan de grond bestaat, wordt CSS een versterker. CSS-beveiliging vereist gelaagde verdediging met aandacht voor de scenario's die aanvallers de meeste hefboomwerking geven voor de minste moeite (met name inlog-, toestemmings- en betalingsstromen).

Een praktische aanpak voorkomt dat kwaadaardige stijlen in de browser worden geladen, detecteert visuele manipulatie en verdedigt gebruikers en systemen om de impact te beperken.

Hoe CSS-gebaseerde aanvallen te voorkomen

Om CSS-aanvallen te voorkomen, blokkeer je ze bij de deur. Als je inline injectie en niet-vertrouwde stijlen stopt voordat ze in de browser worden geladen, kunnen aanvallers je UI niet manipuleren.

De volgende maatregelen maken CSS-misbruik veel moeilijker.

1 - Beheer waar stijlen vandaan kunnen worden geladen met Content Security Policy (CSP)

Gebruik style-src 'self' om alleen stijlen van je eigen domein toe te staan. Vermijd uiteraard style-src 'unsafe-inline' zoveel mogelijk, omdat deze instelling precies geïnjecteerde stijlen mogelijk maakt. Als je toch inline stijlen nodig hebt, is het zinvol om nonces of hashes te gebruiken.

Laat angst om dingen te breken je niet tegenhouden. Je kunt je CSP veilig testen vóór uitrol met CSP Report-Only.

CSP-rapporten laten je zien wat er zou breken. Ze vermelden inline stijlen en externe bronnen die worden geblokkeerd, evenals afhankelijkheden van derden die je misschien was vergeten. Los die op en handhaaf dan het beleid.

2 - Vergrendel CSS van derden met Subresource Integrity (SRI)

Om te voorkomen dat gemanipuleerde bestanden worden geladen, voeg je SRI (integrity + crossorigin) toe voor CDN-gehoste stylesheets.

Bijvoorbeeld:

<link rel="stylesheet" href="https://cdn.example.com/style.css"

integrity="sha384-..." crossorigin="anonymous">

Dit werkt het beste voor stabiele, versioned assets, omdat elke keer dat de CDN dit bestand bijwerkt, de hash verandert. Als gevolg hiervan mislukt je SRI-controle en blokkeert de browser het. Dat betekent dat je de integrity-hash handmatig moet bijwerken. Voor kritieke CSS die vaak verandert, is het beter om deze zelf te hosten.

Subresource Integrity is een sterke verdedigingsmaatregel voor statische bestanden. Dynamische bestanden zoals JavaScript van scripts van derden hebben een oplossing voor continue monitoring nodig.

3 - Blokkeer iframe-insluiting met anti-framing-headers

Een ander groot probleem zijn klassieke clickjacking-aanvallen die je site insluiten in een onzichtbaar iframe op een frauduleuze pagina. Content-Security-Policy: frame-ancestors 'none' en X-Frame-Options: DENY voorkomen dat aanvallers nep-UI-elementen insluiten of overlappen, en daarmee voorkomen ze dat gebruikers worden misleid om op knoppen te klikken waarvan ze zich niet eens bewust zijn.

4 - XSS-preventie = CSS-beveiliging

Inline stijlen verhogen het risico en maken CSP moeilijker te handhaven. De manier waarop je Cross-Site Scripting (XSS) voorkomt, bepaalt grotendeels je CSS-beveiliging. De meeste CSS-misbruiken zijn afhankelijk van een injectieroute (vaak XSS). Als je XSS voorkomt, kan de aanval geen <style>-blokken of inline style=""-attributen injecteren.

Preventieve maatregelen zoals CSP, SRI en XSS-hardening verminderen het risico, maar bieden geen zicht op wat er daadwerkelijk voor gebruikers wordt weergegeven. cside geeft beveiligings- en complianceteams doorlopende zichtbaarheid op paginaniveau in client-side stijl- en lay-outwijzigingen.

Hoe CSS-aanvallen te detecteren: Monitor kritieke UI op misbruik

Preventie alleen is niet genoeg. Maar je kunt niet repareren wat je niet kunt zien. Als een aanval door preventieve maatregelen glipt, vangt detectie het vroeg op. Vraag jezelf dus af waar UI-manipulatie de beveiliging het meest zou beïnvloeden en op welke rode vlaggen je moet letten.

CSS-manipulatie is het meest waarschijnlijk zichtbaar op kritieke UI. Het is een goed idee om geautomatiseerde waarschuwingen in te stellen voor inlog-, afrekening- en betalingspagina's en privacy- en toestemmingspagina's.

1. Handmatige detectie van kwaadaardige CSS

Nu je hebt bepaald waar je moet kijken, let je op onbekende stylesheets die uit het niets verschijnen en controleer je op rode vlaggen en verdachte patronen:

  • extreme z-index wijzen op overlay-aanvallen: z-index: 9999
  • grote negatieve marges om inhoud buiten het scherm te verbergen: margin: -9999px
  • verborgen beveiligingsberichten display: none en visibility: hidden op waarschuwingen, toestemmingsbanners of foutmeldingen
  • Visuele herordening om kritieke informatie onder de vouw te begraven met Flexbox order: 999
  • Kleine lettergrootte of laag contrast voor beperkte zichtbaarheid op "Annuleren/Weigeren"-knoppen font-size: 6px

Handmatige beveiligingscontroles kunnen werken voor beperkte, kleinere projecten; gebruik DevTools voor rode vlaggen op je inlog-, betaal- en toestemmingspagina's. Test vóór productie op mobiel, omdat het voor aanvallers gemakkelijker is om inhoud op een klein scherm te verbergen.

2. Geautomatiseerde detectie van kwaadaardige CSS

Voor grote en complexe builds zijn handmatige controles niet schaalbaar. Bouw in plaats daarvan automatische detectie in je beveiligingsmonitoringsysteem:

  • Client-side runtime beveiligingsmonitoring: cside detecteert DOM- en JavaScript-manipulatie continu in realtime en stuurt een waarschuwing wanneer kritieke elementen worden gemanipuleerd.
  • CSP-schendingsrapporten: voeg report-uri (of report-to) toe aan je CSP zodat browsers beleidsschendingen automatisch rapporteren. Voer ook een CSP-validator uit bij elke build om misconfiguraties te ondervangen.
  • Synthetische monitoring op sleutelpagina's: visuele regressietools detecteren onverwachte UI-wijzigingen door screenshots te vergelijken. Als een betaalknop kleiner wordt of een waarschuwing verdwijnt, weet je het voordat gebruikers dat doen.
  • Inline stijlen-scanners: configureer je CI/CD-pipeline om inline stijlen op kritieke pagina's te scannen en commits te blokkeren voordat ze productie bereiken.

Beveiligingsrisico's van vibe coded CSS

AI-codeertools versnellen webontwikkeling en produceren CSS-stijlen in seconden. Maar er is een afweging: als teams gegenereerde CSS accepteren zonder beveiligingsbeoordeling, riskeren ze ook hun aanvalskwetsbaarheden te versnellen.

Het gebruik van inline stijlen brengt het risico van CSP-omzeiling met zich mee; ongecontroleerde links naar externe CDN's zonder integriteitscontroles creëren supply chain-kwetsbaarheden.

CSS-patronen die je moeten alarmeren:

  • style="display: none" verspreid door de hele code (inline stijlen bemoeilijken CSP en beoordeling)
  • CSS-links van derden zonder Subresource Integrity (SRI)
  • z-index: 999999 maakt volledig scherm-overlays mogelijk
  • Complexe Flexbox/Grid-lay-outs die niemand kan uitleggen
  • Externe icoon- en lettertype-CDN's die standaard worden geladen

AI-codeertools zijn neutraal ten opzichte van je beveiligingszorgen: ze prioriteren snelheid boven beveiliging. En dat is zichtbaar in de uiteindelijke output. Inline stijlen kunnen overal verschijnen zonder duidelijke structuur, wat het later moeilijker maakt om CSP met style-src te handhaven. Externe CDN's waarvan thema's en lettertypen worden opgehaald, kunnen snelkoppelingen zijn die een supply chain-risico creëren.

Lees meer in het speciale artikel met verdedigingstips voor door AI gegenereerde code.

Juan Combariza
Growth Marketer Juan Combariza

Researching & writing about client side security.

FAQ

Frequently Asked Questions

CSS bepaalt wat gebruikers zien. Als je CSS wordt gemanipuleerd, worden je gebruikers dat ook. CSS kan niet op zichzelf als wapen worden ingezet — aanvallers hebben eerst een toegangspunt nodig, zoals Cross-Site Scripting (XSS) of een gecompromitteerde dependency. Zodra aanvallers binnen zijn, kan geïnjecteerde CSS worden gebruikt voor phishing en fraude door gebruikers visueel te misleiden.

XSS injecteert kwaadaardige JavaScript in je pagina en kan acties uitvoeren als een echte gebruiker, waaronder het stelen van cookies of het onderscheppen van toetsaanslagen. CSS-injectie daarentegen manipuleert wat gebruikers op een webpagina zien en is doorgaans de tweede stap in een aanval nadat een pagina al is gecompromitteerd.

Ja. Inline stijlen voegen een style-attribuut rechtstreeks toe aan elementen in de HTML, wat blinde vlekken in de beveiliging creëert op grote, complexe websites. Als aanvallers een kwetsbaarheid zoals XSS misbruiken, kunnen ze overal in de HTML kwaadaardige inline stijlen injecteren, waardoor ze op schaal uiterst moeilijk te vinden en te beoordelen zijn.

Content Security Policy (CSP) werkt als een beveiligingsbewaker bij de ingang: het controleert inloggegevens, maar kan het gedrag binnenin niet controleren. Hoewel CSP inline stijlen standaard blokkeert, schakelen veel sites unsafe-inline in om te voorkomen dat functies breken. Dit creëert een kwetsbaarheid omdat aanvallers overal kwaadaardige inline stijlen kunnen injecteren, en CSP die dan toestaat. Veiligere alternatieven zijn het gebruik van nonces of hashes voor goedgekeurde `