Extra beveiliging van statische websites
Jeremy Melis
06-02-2026
Inleiding
Dit blog gaat in op de praktische toepassingen van statische websites en licht toe waarom deze in veel gevallen extra beveiliging bieden ten opzichte van dynamische websites. Er wordt besproken in welke situaties statische websites een geschikte keuze zijn, hoe ze in de praktijk worden ingezet en welke voordelen ze hebben op het gebied van prestaties, onderhoud en veiligheid. Daarnaast wordt uitgelegd waarom het ontbreken van server-side code en databases het aanvalsoppervlak verkleint, waardoor statische websites minder kwetsbaar zijn voor veelvoorkomende beveiligingsproblemen die bij dynamische websites wel voorkomen.
Server-side versus Client-side
Twee belangrijke termen om te onthouden zijn Server-side en Client-side. Deze termen geven aan waar code op uitgevoerd wordt. Client-side code wordt uitgevoerd op de computer van de gebruiker (de client), meestal in de webbrowser. Server-side wil zeggen dat de code wordt uitgevoerd door de computer waar de website op staat. Deze computer wordt de server genoemd, vandaar de naam.
Wat zijn statische en dynamische websites?
Statische websites zijn websites waarbij geen server-side code wordt uitgevoerd. Dit betekent dat de website volledig bestaat uit HTML, CSS, JavaScript en andere client-side programeer- en scripttalen. De inhoud van een statische website ligt vast en wordt niet aangepast op basis van gebruikersinput of databasegegevens. Elke bezoeker krijgt in principe exact dezelfde webpagina te zien. Statische websites zijn vaak sneller, goedkoper, eenvoudiger te hosten en minder gevoelig voor beveiligingsproblemen, omdat er geen server-side logica of database aan te pas komt.
Een dynamische website daarentegen maakt gebruik van server-side code. De inhoud van de website wordt door de server gegenereerd en kan verschillen per gebruiker, tijdstip of invoer. Dynamische websites gebruiken vaak een database om gegevens op te slaan en op te halen. Websites die gebruikmaken van een CMS (Content Management System) zijn dynamisch, omdat ze server-side programmeertalen gebruiken. Een bekend voorbeeld is WordPress, dat voornamelijk gebruikmaakt van PHP in combinatie met een database zoals MySQL. Hierdoor kunnen beheerders eenvoudig inhoud aanpassen zonder direct de code te hoeven wijzigen.
Hoewel statische websites zelf geen server-side code bevatten, kunnen ze toch CRUD-acties (Create, Read, Update, Delete) uitvoeren. Dit gebeurt via externe diensenten zoals API’s. Met behulp van JavaScript kan een statische website HTTPs-requests versturen naar een externe backend, bijvoorbeeld een REST-API of cloud service. De HTTPs-requests worden dan verstuurd vanuit de computer van de client in plaats van vanaf de server waarop de website gehosts is.
Beveiliging
Er kan van worden uitgegaan dat alle client-side code door een aanvaller kan worden aangepast. Deze code wordt immers uitgevoerd op de computer van de gebruiker, en die gebruiker kan zelf ook een hacker zijn. Client-side code is daarom per definitie onbetrouwbaar en mag nooit worden vertrouwd voor kritieke logica of beveiliging.
Bij een statische website betekent dit dat het ophalen en opslaan van gegevens niet in de client kan plaatsvinden. Daarvoor is een aparte server nodig: een back-end die uitsluitend server-side code bevat. Op het eerste gezicht lijkt dit een nadeel, omdat er een extra servercomponent nodig is. In de praktijk vergroot dit echter de veiligheid aanzienlijk, omdat gevoelige functionaliteit volledig wordt afgeschermd van de client.
Doordat de server-side logica strikt gescheiden is van de client, heeft een aanvaller geen directe toegang tot de kern van het systeem. Zelfs als de client-side code wordt gemanipuleerd, blijven de belangrijkste onderdelen van de applicatie beschermd. Dit verkleint de impact van veel voorkomende kwetsbaarheden, zoals Cross-Site Scripting (XSS).
XSS
Bij een XSS-aanval kan een aanvaller kwaadaardige JavaScript-code uitvoeren in de browser. Afhankelijk van het type ook in de browser van een andere gebruiker. Het uiteindelijke doel van een hacker is daarbij vaak niet de gebruiker zelf, maar het verkrijgen van verdere toegang tot het systeem, bijvoorbeeld door sessies over te nemen of beheerdersrechten te misbruiken. In het ergste geval kan dit leiden tot het uitvoeren van code op de server.
Bij veel dynamische websites kan een XSS-kwetsbaarheid daarom grote gevolgen hebben. Als een beheerder bijvoorbeeld op een kwaadaardige link klikt, kan de aanvaller via die sessie toegang krijgen tot de server-side omgeving. Bij systemen zoals WordPress kan een XSS-kwetsbaarheid zelfs een opstap zijn naar het uitvoeren van code op de server zelf, met een volledige compromitteren van het systeem als mogelijk gevolg.
Een concreet voorbeeld hiervan is te zien in de case XSS Gemeente Eindhoven
(https://melisitsolutions.com/nl/writeups/XSS_Eindhoven/). Deze kwetsbaarheid laat zien hoe een XSS-lek mogelijk kan worden misbruikt om een administrator te misleiden. De kwetsbaarheid gevonden laat de hacker namelijk een link maken die JavaScript code uitvoert wanneer iemand deze gebruikt. Als een dergelijke kwetsbaarheid zich had voorgedaan in een dynamische website met nauwe koppeling tussen client en server, had één verkeerde klik al kunnen leiden tot directe toegang tot de achterliggende server.
Bij een statische website met een strikt gescheiden back-end blijft de schade van een XSS-aanval doorgaans beperkt. De aanval richt zich dan vooral op andere gebruikers (zoals sessie-overname of phishing), maar biedt geen directe route naar server-side code-uitvoering. Juist deze scheiding maakt statische architecturen in de praktijk vaak robuuster en veiliger.
Hoe herkent u of uw website statisch of dynamisch is?
Er zijn verschillende manieren om te bepalen of een website statisch of dynamisch is. We leggen het hier eenvoudig uit.
1. Als u de website zelf heeft geprogrammeerd
- Dynamische website:
Als u programmeertalen zoals Python, PHP of Java gebruikt om pagina’s direct te laten zien die veranderen afhankelijk van wie de website bezoekt, is de website dynamisch. De inhoud wordt dus live door de server gegenereerd. - Statische website:
Als u alleen HTML, CSS, JavaScript of TypeScript gebruikt en de pagina’s van tevoren maakt, is de website statisch. De inhoud van de pagina verandert niet automatisch. Zelfs als de website gegevens ophaalt van een server via een API, blijft de website statisch, omdat de pagina zelf niet live door de server wordt opgebouwd.
2. Als u een CMS gebruikt
Een CMS (Content Management System) zoals WordPress of ContentHub maakt altijd een dynamische website, omdat de server bij elk bezoek de inhoud uit een database haalt en de pagina op dat moment samenstelt.
3. Door naar de functionaliteit te kijken
- Statische website:
- Pagina’s worden vooraf gemaakt en veranderen niet automatisch op de server.
- De inhoud is meestal “vast”, maar kan via externe scripts of services beperkte interactie hebben, zoals een login of formulier.
- Handmatige aanpassingen zijn nodig om de inhoud te veranderen.
- Dynamische website:
- Pagina’s worden live gegenereerd door de server, vaak afhankelijk van de gebruiker of acties.
- U kunt inloggen, berichten plaatsen, reageren, of persoonlijke inhoud zien, zonder dat er naar een andere server gecommuniceerd wordt.
- De inhoud verandert automatisch op basis van acties van gebruikers of andere gegevens.
Kort gezegd:
- Statisch = vaste pagina’s, zelfs als er data van een server wordt gebruikt
- Dynamisch = pagina’s worden live door de server gegenereerd voor elke bezoeker
Samenvatting
Dit blog legt de verschillen uit tussen statische en dynamische websites, met een sterke focus op hun praktische toepassingen en beveiligingsimplicaties. Statische websites bestaan volledig uit client-side technologieën zoals HTML, CSS en JavaScript en voeren geen server-side code uit. Daardoor leveren ze dezelfde content aan elke bezoeker, laden ze sneller, zijn ze eenvoudiger te onderhouden en hebben ze een kleiner aanvalsoppervlak.
Dynamische websites daarentegen maken gebruik van server-side code en databases om content in realtime te genereren, vaak met behulp van contentmanagementsystemen zoals WordPress. Hoewel dit meer flexibiliteit en personalisatie mogelijk maakt, brengt het ook meer potentiële beveiligingsrisico’s met zich mee.
Een belangrijk beveiligingsvoordeel van statische websites is de strikte scheiding tussen client-side code en server-side logica. Gevoelige handelingen worden afgehandeld door een externe backend of API, waardoor de impact van veelvoorkomende kwetsbaarheden zoals Cross-Site Scripting (XSS) wordt verminderd. Zelfs als client-side code wordt gemanipuleerd, kunnen aanvallers niet direct toegang krijgen tot server-side functionaliteit.