Direct naar de inhoud

Cookie-instellingen

Kies per soort welke cookies je toestaat. Je kunt je keuze altijd wijzigen via Cookie-instellingen onderaan elke pagina. Privacyverklaring

Noodzakelijk

Altijd aan

Nodig om in te loggen, je winkelwagen te bewaren en je keuzes te onthouden. Deze staan altijd aan.

Welke cookies?
  • weboke_sessie, weboke_klant, weboke_remember: je sessie en ingelogd blijven
  • weboke_basket: je winkelwagen
  • wkBtwIncl: prijzen met of zonder btw tonen
  • wok_cookies: je cookiekeuze, 12 maanden

Meet welke advertentie tot een bezoek of bestelling leidt, zodat we niet betalen voor advertenties die niets doen.

Welke cookies?
  • Google Ads via Google Tag Manager (_gcl_au, _gcl_aw), tot 90 dagen
  • OpenAI Ads, advertenties in ChatGPT
  • wok_aff: via welke partner je bij ons kwam (affiliateprogramma), 60 dagen

4,6

Land en taal

Elk land heeft zijn eigen site, met prijzen en btw van dat land.

Bekijken

Module 4 · 4.2

Je website: https, HSTS en beveiligingsheaders

Module 4: E-mail, website en domein · Leestijd: 11 minuten

Leerdoel: Na deze les kun je de basisbeveiliging van je website controleren: een geldig certificaat, doorsturen naar https, HSTS met een goede max-age, de belangrijkste beveiligingsheaders en het bijwerken van je CMS.
Kernbegrippen: TLS-certificaat, https, doorsturen naar https, HSTS, max-age, includeSubDomains, preload, HTTP-header, Content-Security-Policy, X-Content-Type-Options, frame-ancestors, X-Frame-Options, Referrer-Policy

Wat er gebeurt als iemand je site opent

Typt een klant example.com in de adresbalk, dan vraagt de browser de pagina op bij je webserver. Dat gesprek gaat via HTTP. Bij https zit er een versleutelde verbinding omheen: TLS. Daarvoor heeft je website een TLS-certificaat nodig (vaak nog SSL-certificaat genoemd). Het certificaat bewijst dat de server echt bij example.com hoort, en de versleuteling zorgt dat niemand onderweg kan meelezen of iets kan veranderen. Dat is belangrijk op openbare wifi, waar je niet weet wie het netwerk beheert (les 5.3).

Bij elk antwoord stuurt de server, naast de pagina zelf, een rijtje headers mee: korte regels met informatie en instructies voor de browser. Je ziet ze niet op het scherm, maar ze bepalen voor een groot deel hoe veilig de browser met je site omgaat. Een deel van die headers zijn beveiligingsheaders. In deze les gaan we langs de vier lagen: certificaat, doorsturen, HSTS en headers. Daarna kijken we kort naar het bijwerken van je website zelf.

Laag 1: een geldig certificaat

Een certificaat is in orde als het aan drie voorwaarden voldoet:

  1. het is niet verlopen;
  2. het is uitgegeven door een vertrouwde uitgever (een certificaatautoriteit die de browsers kennen, zoals Let's Encrypt of een commerciële partij);
  3. het geldt voor precies de naam die de bezoeker opent: example.com én www.example.com als je die allebei gebruikt.

Bijna elke hostingpartij regelt tegenwoordig een gratis certificaat dat vanzelf wordt verlengd. Gaat het mis, dan is dat meestal omdat de domeinnaam naar een andere server wijst, of omdat een CAA-record de uitgever blokkeert (les 4.3).

Belangrijk om te weten: een slotje zegt niets over de betrouwbaarheid van de site. Het zegt alleen dat de verbinding versleuteld is en dat het certificaat bij de naam in de adresbalk hoort. Phishingsites op mijnbank-veilig.example hebben net zo goed een slotje. Daarom leer je in les 3.2 het domein lezen.

Laag 2: altijd doorsturen naar https

Een certificaat alleen is niet genoeg. Wie http://example.com opent, bijvoorbeeld via een oude link of door alleen de naam te typen, moet automatisch naar de https-versie gaan. Dat heet doorsturen (een redirect, meestal met statuscode 301).

Een nette volgorde is:

http://example.com      ->  https://example.com
https://example.com     ->  https://www.example.com   (alleen als je www als hoofdadres gebruikt)
http://www.example.com  ->  https://www.example.com

Let op de eerste regel: stuur van http eerst naar https op dezelfde naam, pas daarna eventueel naar www. Zo kan de browser de HSTS-instructie van de kale naam ook ontvangen. Internet.nl controleert precies dit.

Een veelgemaakte fout is dubbel doorsturen: in het hostingpaneel én in een plugin of in .htaccess. Dat kan een eindeloze lus geven ("te veel omleidingen"). Gebruik één plek.

Laag 3: HSTS

Doorsturen heeft een zwak moment: het allereerste verzoek gaat nog onversleuteld via http. Een aanvaller op hetzelfde netwerk kan dat ene verzoek onderscheppen en de bezoeker op een nagemaakte, onversleutelde versie houden. Daar is HSTS (HTTP Strict Transport Security, RFC 6797) voor.

Met HSTS stuurt je site via https een header mee:

Strict-Transport-Security: max-age=31536000; includeSubDomains

De browser onthoudt dan: "deze site alleen via https openen, de komende 31.536.000 seconden (een jaar)". Typt de bezoeker later http://example.com, dan maakt de browser er zelf https van, nog voordat er iets over het netwerk gaat. Het zwakke eerste verzoek valt weg.

OnderdeelBetekenis
max-age=Hoe lang de browser het onthoudt, in seconden. Internet.nl rekent minstens een jaar (max-age=31536000) als voldoende; een korte periode beschermt mensen die je site maar af en toe bezoeken niet.
includeSubDomainsGeldt ook voor alle subdomeinen, zoals shop.example.com en mail.example.com.
preloadJe vraagt om opname in de lijst die in browsers is ingebouwd (hstspreload.org). Dan is zelfs het allereerste bezoek beschermd. Eisen: onder meer max-age van minstens een jaar, includeSubDomains en alle subdomeinen op https. Er weer af komen duurt lang.
max-age=0Wist de onthouden instructie weer.

Drie dingen die je moet weten voordat je HSTS aanzet:

  • Eerst moet https overal werken. Een browser die HSTS heeft onthouden en een certificaatfout ziet, geeft de bezoeker geen knop om toch door te gaan (RFC 6797, paragraaf 12.1). Verloopt je certificaat of klopt het niet voor www, dan is je site voor die bezoekers onbereikbaar tot het is opgelost.
  • includeSubDomains raakt alles onder je domein. Een oud subdomein zonder certificaat, bijvoorbeeld een printer- of camerapagina op camera.example.com, is daarna niet meer te openen.
  • Bouw het op. Begin met een korte max-age (bijvoorbeeld een dag), controleer of alles werkt, en verhoog in stappen naar een jaar. Wacht bij elke stap de hele periode af.

Een HSTS-header die via gewoon http binnenkomt, negeert de browser. Je ziet hem dus alleen in het https-antwoord.

Laag 4: beveiligingsheaders

Naast HSTS zijn er een paar headers die de browser vertellen wat hij wel en niet mag met je pagina's. Je hoeft ze niet allemaal perfect te hebben, maar de eerste drie zijn eenvoudig en zonder risico.

HeaderWaartegenGoede waarde
X-Content-Type-OptionsDe browser gaat zelf raden wat een bestand is, waardoor een geüpload "plaatje" als script kan worden uitgevoerd.nosniff (de enige geldige waarde)
Content-Security-Policy: frame-ancestors ... of X-Frame-OptionsClickjacking: een andere site laadt jouw pagina onzichtbaar in een frame en laat bezoekers ongemerkt op jouw knoppen klikken.frame-ancestors 'self' of 'none'; de oudere header X-Frame-Options: SAMEORIGIN of DENY
Referrer-PolicyBij een klik naar een andere site stuurt de browser het adres van de vorige pagina mee. Daar kan gevoelige informatie in staan, zoals een zoekterm of een ordernummer.no-referrer of same-origin (streng), strict-origin-when-cross-origin (gangbaar, internet.nl geeft hier een waarschuwing)
Content-Security-Policy (volledig)Beperkt vanaf welke plekken scripts, stijlen en afbeeldingen mogen laden. Maakt ingevoegde kwaadaardige scripts (XSS) veel moeilijker.Maatwerk per site. Vermijd unsafe-inline, unsafe-eval en wildcards.

Een volledige Content-Security-Policy is het krachtigst, maar ook het lastigst: een te strenge regel breekt je statistieken, je betaalknop of je chatvenster. Met de variant Content-Security-Policy-Report-Only kun je eerst meten wat er zou worden geblokkeerd, zonder iets te breken. Laat dit over aan je webbouwer, of begin alleen met frame-ancestors.

Headers zelf bekijken

Open je site in een browser, druk op F12 (of kies "Inspecteren"), ga naar het tabblad Netwerk, laad de pagina opnieuw en klik op het eerste verzoek. Onder "Antwoordheaders" (Response Headers) zie je alles wat de server meestuurt. Met de opdrachtregel kan het ook:

curl -sI https://example.com/

De website zelf: CMS, plugins en thema's

De beste headers helpen niet als de software achter je site lek is. De meeste gehackte sites van kleine bedrijven zijn niet via de webserver binnengekomen, maar via een verouderde plugin, een thema dat al jaren niet meer wordt bijgewerkt, of een zwak beheerderswachtwoord.

  • Zet automatische updates aan voor je CMS (bijvoorbeeld WordPress, Joomla of een ander systeem) en voor plugins waar dat kan.
  • Verwijder plugins en thema's die je niet gebruikt; uitgeschakeld is niet genoeg, de bestanden staan er nog.
  • Gebruik voor de beheerderslogin een sterk, uniek wachtwoord en tweestapsverificatie (module 2), en beperk het aantal inlogpogingen.
  • Hou de PHP-versie (of andere taal) van je pakket op een versie die nog updates krijgt (les 5.1).

In de praktijk: zo ziet het eruit

In DirectAdmin, het paneel dat WebOké gebruikt, zet je bij je domein eerst Beveiligde SSL verbinding aan en daarna Forceer SSL met https omleiding. Op dezelfde plek staat een schakelaar voor HSTS; zet die pas aan als het certificaat voor alle namen werkt. Bij andere aanbieders werkt het vergelijkbaar, of je regelt het in de instellingen van je CMS.

Draait je site op Apache of LiteSpeed, dan kun je de headers ook in .htaccess zetten:

<IfModule mod_headers.c>
  Header always set Strict-Transport-Security "max-age=31536000"
  Header always set X-Content-Type-Options "nosniff"
  Header always set Content-Security-Policy "frame-ancestors 'self'"
  Header always set Referrer-Policy "strict-origin-when-cross-origin"
</IfModule>

Voeg includeSubDomains pas toe als je zeker weet dat elk subdomein https heeft. Controleer na elke wijziging met de websitetest van internet.nl of met de ontwikkelaarstools van je browser.

Samenvatting

  • Een slotje betekent: versleuteld en de juiste naam. Het betekent niet: betrouwbaar.
  • Stuur http altijd door naar https, eerst op dezelfde naam, en op één plek.
  • HSTS laat de browser onthouden dat je site alleen via https gaat; internet.nl rekent een max-age van minstens een jaar (31536000) als goed. Zet het pas aan als https overal werkt, en bouw het op.
  • X-Content-Type-Options: nosniff, frame-ancestors (of X-Frame-Options) en Referrer-Policy zijn eenvoudig; een volledige Content-Security-Policy is maatwerk.
  • Updates van je CMS, plugins en thema's zijn minstens zo belangrijk als headers.

Quiz

1. Wat voorkomt HSTS precies?



2. Je zet Strict-Transport-Security: max-age=31536000; includeSubDomains aan. Een week later verloopt het certificaat van shop.example.com. Wat merken vaste bezoekers?



3. Welke max-age rekent internet.nl minimaal als voldoende voor HSTS?



4. Waartegen beschermt Content-Security-Policy: frame-ancestors 'self'?



5. Je ziet een slotje op mijnbank-veilig.example in de adresbalk. Wat weet je daardoor zeker?



Opdracht

Opdracht A4.2: Https, HSTS en headers van je website controleren. Vul de domeinnaam van je website in (heb je er geen, gebruik dan internet.nl). Het programma opent http:// en https:// van je domein en controleert het certificaat, het doorsturen naar https, HSTS en de beveiligingsheaders. Je krijgt per punt groen, oranje of rood met uitleg.

Opdracht A4.2: Https, HSTS en headers van je website controleren

Vul de domeinnaam van je website in (heb je er geen, gebruik dan internet.nl). Het programma opent http:// en https:// van je domein en controleert het certificaat, het doorsturen naar https, HSTS en de beveiligingsheaders. Vul daarna de max-age van HSTS in.



Wat je invult en wat we vinden, slaan we niet op. Je browser onthoudt je antwoorden en of je de opdracht hebt gehaald. Ben je aangemeld, dan bewaren we alleen dat je de opdracht (bijna) goed had in Mijn cursussen; daar kun je het ook verwijderen.

Opdracht D4.2: Je website bijwerken en opruimen. Log in op het beheer van je website, controleer de versie van je CMS, plugins en thema's, verwijder wat je niet gebruikt en zet automatische updates aan waar dat kan. Vink de checklist af en beantwoord de reflectievraag.

Opdracht D4.2: Je website bijwerken en opruimen

Zo pak je het aan: (1) Log in op het beheer van je website (of vraag je webbouwer om dit samen te doen). (2) Noteer de versie van je CMS en kijk of er updates klaarstaan. (3) Maak een back-up (les 6.1), installeer de updates van CMS, plugins en thema's. (4) Verwijder plugins en thema's die je niet gebruikt. (5) Zet automatische updates aan waar dat kan. (6) Controleer welke beheerdersaccounts er zijn en verwijder accounts van mensen die er niet meer werken. (7) Zet tweestapsverificatie aan voor elk beheerdersaccount.




Je vinkjes en aantekeningen blijven alleen in deze browser; we sturen ze nergens heen. Ben je aangemeld, dan bewaren we in Mijn cursussen alleen dat je de opdracht gedaan hebt.

Verder lezen

De stappen in de WebOké-artikelen gelden voor de omgeving van WebOké; bij andere aanbieders werkt het vergelijkbaar.

Even geduld…

Stel je domeinen in

Regel per domein de nameservers, de koppeling aan je hosting en wie de eigenaar wordt.

Je domeinen laden…