2026年11月12日
2026年11月12日
WordPress-versie verbergen: generator-tag, ver= en readme.html
Dit artikel is een gelokaliseerde versie van het Japanse origineel. Lees het Japanse origineel
In de beginstand schrijft WordPress zijn eigen versienummer in de HTML van pagina's en in feeds. Aanvallers kunnen dat gebruiken om te onderzoeken of het een versie met een bekende kwetsbaarheid is. In dit artikel zie je waar de versie wordt getoond en hoe je die verbergt. De inhoud is van oktober 2026.
Wat je eerst moet weten: de versie verbergen is slechts een aanvullende maatregel. Je kunt de versie ook afleiden uit bijvoorbeeld de inhoud van CSS- en JavaScript-bestanden, dus verbergen garandeert niet dat de versie niet te achterhalen is. Het meest effectief is WordPress zelf, plugins en thema's up-to-date houden.
Waar de versie wordt getoond
| Plek | Wat wordt getoond | Aanpak |
|---|---|---|
<head> van de HTML |
Een tag zoals <meta name="generator" content="WordPress 6.9.4"> |
Het filter the_generator |
| RSS- en Atom-feeds | Een regel zoals <generator>https://wordpress.org/?v=6.9.4</generator> |
Eveneens het filter the_generator |
| URL's van CSS en JavaScript | Een ?ver= zoals in style.min.css?ver=6.9.4 |
De filters style_loader_src en script_loader_src |
| HTTP-headers | X-Powered-By: PHP/8.3.x (de versie van PHP, niet van WordPress) |
expose_php in php.ini |
readme.html |
Dat je WordPress gebruikt (in de huidige readme.html staat geen versienummer) | De toegang weigeren |
De sitegegevens die de REST API op /wp-json/ teruggeeft (naam, beschrijving, URL, tijdzone, namespaces enzovoort) bevatten de WordPress-versie niet. Je hoeft de uitvoer van de REST API dus niet te beperken om de versie te verbergen.
Stap 1: controleer wat nu wordt getoond
Vervang de URL door die van je eigen site en voer dit uit op je eigen computer of server. Gebruik je een cacheplugin of een CDN, leeg dan na de wijziging de cache voordat je controleert.
# De generator-tag in de HTML
curl -s https://example.com/ | grep -i 'name="generator"'
# De generator in de feed
curl -s https://example.com/feed/ | grep -i '<generator>'
# Overzicht van de waarden van ver= bij CSS en JS
curl -s https://example.com/ | grep -oE 'ver=[0-9][0-9.]*' | sort | uniq -c
# De HTTP-header X-Powered-By
curl -sI https://example.com/ | grep -i 'x-powered-by'
# Is readme.html leesbaar? (bij 200 wel)
curl -s -o /dev/null -w '%{http_code}\n' https://example.com/readme.html
Staat in het overzicht van ver= dezelfde waarde als de WordPress-versie die in het beheer wordt getoond onder "Dashboard" → "Updates" (Dashboard → Updates), dan is aan die CSS of JS de WordPress-versie af te lezen. Als de kern van WordPress of het thema bij het laden van CSS en JS geen versie opgeeft, wordt de WordPress-versie in ver= gezet.
Stap 2: bepaal waar je de code neemt
Zet de code uit dit artikel op een van de volgende plekken.
- mu-plugin (aanbevolen): zet een PHP-bestand in de map
wp-content/mu-plugins/(maak die aan als ze er niet is), dan wordt het geladen zonder dat je het hoeft te activeren. Het effect blijft ook als je van thema wisselt - De functions.php van een child-thema: schrijf je het in de functions.php van het parent-thema, dan verdwijnt het bij een update van het thema
Kies je voor een mu-plugin, bewaar dan de code uit de volgende stappen in één bestand met een naam zoals wp-content/mu-plugins/hide-wp-version.php.
Stap 3: de generator-tag en de versie in ver= verbergen
<?php
/**
* Plugin Name: Hide WordPress Version
* Description: Verbergt de WordPress-versie in de generator-tag en in ver= bij CSS en JS.
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
// Maak de <meta name="generator"> in de HTML en de <generator> in de feed leeg.
add_filter( 'the_generator', '__return_empty_string' );
/**
* Vervang ver= bij CSS en JS alleen door een andere waarde als die gelijk is aan de WordPress-versie.
* Omdat ver= wordt vervangen en niet verwijderd, wordt de browsercache ook na een WordPress-update ververst.
*/
function wpdr_replace_wp_version_query( $src ) {
if ( ! is_string( $src ) || '' === $src ) {
return $src;
}
$query = wp_parse_url( $src, PHP_URL_QUERY );
if ( empty( $query ) ) {
return $src;
}
parse_str( $query, $args );
$wp_version = get_bloginfo( 'version' );
if ( isset( $args['ver'] ) && $args['ver'] === $wp_version ) {
$src = add_query_arg( 'ver', substr( wp_hash( $wp_version ), 0, 10 ), $src );
}
return $src;
}
add_filter( 'style_loader_src', 'wpdr_replace_wp_version_query', 20 );
add_filter( 'script_loader_src', 'wpdr_replace_wp_version_query', 20 );
De kernpunten zijn de volgende.
- Het filter
the_generatorwerkt zowel op de generator-tag in de HTML als op de generator in de feed.remove_action( 'wp_head', 'wp_generator' );verwijdert alleen de tag in de HTML en werkt dus niet op de feed - Verwijder je elke
?ver=, dan kan de browser na een update van een plugin of thema oude CSS en JS blijven gebruiken. De code hierboven vervangt de waarde alleen als die gelijk is aan de WordPress-versie, door een andere tekenreeks die uit de versie is afgeleid. Bij een update van WordPress verandert de waarde ook, dus de cache wordt ververst - Een
ver=met een eigen versienummer van een plugin of thema blijft ongewijzigd
Controleer na het opslaan met de opdrachten uit stap 1 dat er geen generator meer verschijnt en dat de WordPress-versie niet meer in het overzicht van ver= staat. Gebruik je een cacheplugin, leeg dan de cache voordat je controleert.
Stap 4: de header X-Powered-By stoppen
X-Powered-By is een header die niet door WordPress maar door PHP wordt toegevoegd en die de versie van PHP verraadt. Om dat te stoppen zet je expose_php in het PHP-configuratiebestand (php.ini) op Off. Deze instelling kun je alleen in php.ini wijzigen.
expose_php = Off
Dit is een voorbeeld voor een VPS met Ubuntu en PHP-FPM (pas 8.3 aan de versie van PHP aan die je gebruikt).
# Controleer de huidige instelling
grep -n '^expose_php' /etc/php/8.3/fpm/php.ini
# Herstart PHP-FPM nadat je het hebt gewijzigd
sudo systemctl restart php8.3-fpm
De php.ini in het pakket van Ubuntu heeft in de beginstand expose_php = Off. Wordt de header toch getoond, controleer dan of er een andere php.ini wordt gebruikt. Bij shared hosting kun je dit soms wijzigen in de PHP-instellingen van het beheerscherm en soms niet.
Kun je php.ini niet wijzigen, dan kun je de header ook met WordPress-code verwijderen. Maar send_headers is een hook die wordt uitgevoerd wanneer WordPress een pagina aan de voorkant toont, dus op het beheer en de inlogpagina werkt dat niet.
add_action( 'send_headers', function () {
header_remove( 'X-Powered-By' );
} );
Stap 5: de toegang tot readme.html en license.txt weigeren
readme.html en license.txt zijn bestanden van de kern van WordPress. In de huidige readme.html staat geen versienummer, maar je kunt er wel aan zien dat WordPress wordt gebruikt.
Ook als je ze verwijdert, komen ze terug bij een update van de kern van WordPress. De toegang weigeren op de webserver kost minder moeite dan verwijderen.
Bij Apache (.htaccess)
Voeg dit toe aan de .htaccess in de map van WordPress. Het gedeelte tussen # BEGIN WordPress en # END WordPress wordt door WordPress herschreven, dus schrijf het erbuiten. Dit is de notatie van Apache 2.4 (Order en Deny from all zijn de oude notatie van Apache 2.2).
<FilesMatch "^(readme\.html|license\.txt)$">
Require all denied
</FilesMatch>
Bij Nginx
Voeg dit toe aan het server-blok van de site, controleer de configuratie en laad die daarna opnieuw.
location ~* ^/(readme\.html|license\.txt)$ {
deny all;
}
sudo nginx -t && sudo systemctl reload nginx
Voer na het toevoegen curl -s -o /dev/null -w '%{http_code}\n' https://example.com/readme.html uit en controleer of je 403 terugkrijgt.
Wat verbergen niet voorkomt
- De inhoud van de CSS- en JS-bestanden van WordPress verschilt per versie een beetje, dus als je de bestanden ophaalt en vergelijkt, kun je de versie afleiden
- Uit het
readme.txtofver=van plugins en thema's kun je soms de versie van de plugin afleiden. Kwetsbaarheden in plugins worden vaker aangevallen dan die in de kern - Wie in het beheer kan inloggen, ziet de versie nog steeds zoals eerder
Zorg daarom naast het verbergen van de versie ook voor updates van de kern, plugins en thema's, verwijder plugins die je niet gebruikt en schakel het bewerken van bestanden in het beheer uit.
Samenvatting
- De versie verschijnt vooral in de generator in de HTML en in feeds, en in
?ver=bij CSS en JS. De REST API op/wp-json/bevat de WordPress-versie niet - Met
add_filter( 'the_generator', '__return_empty_string' );verwijder je de generator in zowel de HTML als de feed - Verwijder
?ver=niet, maar vervang alleen de waarde die gelijk is aan de WordPress-versie. Dan wordt het verversen van de cache niet geblokkeerd - Stop
X-Powered-Bymetexpose_php = Offin php.ini readme.htmlkomt na het verwijderen terug bij een update, dus weiger de toegang op de webserver- Verbergen is een aanvullende maatregel; het belangrijkst is dat je blijft updaten
Gerelateerde artikelen:
- Beveiligingsheaders instellen in WordPress: .htaccess, Nginx en functions.php
- De toegang tot de REST API van WordPress beperken
- De bestandseditor voor thema's en plugins in WordPress uitschakelen: DISALLOW_FILE_EDIT
Vragen over WordPress? De uitgever van deze site zit in Japan en antwoordt in het Japans. Contact (Japans)