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_generator werkt 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.txt of ver= 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-By met expose_php = Off in php.ini
  • readme.html komt 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:

Vragen over WordPress? De uitgever van deze site zit in Japan en antwoordt in het Japans. Contact (Japans)

お気軽にご相談ください

お見積りへ お問い合わせへ
▲