2026年11月12日
2026年11月12日
WordPress-Version ausblenden: Generator-Tag, ver= und readme.html
Dieser Artikel ist eine lokalisierte Fassung des japanischen Originals. Japanisches Original lesen
Im Standardzustand schreibt WordPress seine Versionsnummer in das HTML der Seiten und in die Feeds. Angreifer nutzen das mitunter als Anhaltspunkt, um zu prüfen, ob die Version bekannte Schwachstellen hat. Dieser Artikel zeigt, wo die Version angezeigt wird und wie Sie sie verbergen. Der Inhalt entspricht dem Stand Oktober 2026.
Vorab sollten Sie wissen: Die Version zu verbergen ist nur eine Zusatzmaßnahme. Da sich die Version auch aus dem Inhalt von CSS- und JavaScript-Dateien erschließen lässt, ist sie trotz Verbergen nicht zwingend geschützt. Am meisten bringt es, WordPress selbst, Plugins und Themes aktuell zu halten.
Wo die Version angezeigt wird
| Ort | Angezeigter Inhalt | Maßnahme |
|---|---|---|
<head> des HTML |
Ein Tag wie <meta name="generator" content="WordPress 6.9.4"> |
Filter the_generator |
| RSS- und Atom-Feeds | Eine Zeile wie <generator>https://wordpress.org/?v=6.9.4</generator> |
Ebenfalls der Filter the_generator |
| URLs von CSS und JavaScript | Ein ?ver= wie bei style.min.css?ver=6.9.4 |
Filter style_loader_src und script_loader_src |
| HTTP-Header | X-Powered-By: PHP/8.3.x (die PHP-Version, nicht die von WordPress) |
expose_php in der php.ini |
readme.html |
Dass WordPress verwendet wird (die aktuelle readme.html enthält keine Versionsnummer) | Zugriff verweigern |
Die Website-Informationen, die die REST API unter /wp-json/ zurückgibt (Name, Beschreibung, URL, Zeitzone, Namespaces usw.), enthalten keine WordPress-Version. Um die Version zu verbergen, müssen Sie die Ausgabe der REST API nicht kürzen.
Schritt 1: Den aktuellen Anzeigezustand prüfen
Ersetzen Sie die URL durch die Ihrer eigenen Website und führen Sie die Befehle auf Ihrem Rechner oder Server aus. Wenn Sie Cache-Plugins oder ein CDN nutzen, leeren Sie nach der Änderung zuerst den Cache und prüfen dann.
# Generator-Tag im HTML
curl -s https://example.com/ | grep -i 'name="generator"'
# Generator im Feed
curl -s https://example.com/feed/ | grep -i '<generator>'
# Liste der ver=-Werte in CSS und JS
curl -s https://example.com/ | grep -oE 'ver=[0-9][0-9.]*' | sort | uniq -c
# X-Powered-By im HTTP-Header
curl -sI https://example.com/ | grep -i 'x-powered-by'
# Ist readme.html abrufbar? (200 bedeutet abrufbar)
curl -s -o /dev/null -w '%{http_code}\n' https://example.com/readme.html
Steht in der ver=-Liste derselbe Wert wie die WordPress-Version, die der Admin-Bereich unter „Dashboard“ → „Aktualisierungen“ (Dashboard → Updates) anzeigt, verrät diese CSS- oder JS-Datei die WordPress-Version. Wenn WordPress selbst oder ein Theme CSS und JS ohne Versionsangabe lädt, wird die WordPress-Version in ver= eingetragen.
Schritt 2: Entscheiden, wo der Code hinkommt
Den Code in diesem Artikel legen Sie an einer der beiden folgenden Stellen ab.
- mu-plugin (empfohlen): Eine PHP-Datei im Ordner
wp-content/mu-plugins/(bei Bedarf anlegen) wird ohne Aktivierung geladen. Die Wirkung bleibt auch bei einem Theme-Wechsel bestehen - functions.php eines Child-Themes: Was Sie in die functions.php des übergeordneten Themes schreiben, geht bei Theme-Updates verloren
Für ein mu-plugin speichern Sie den Code der folgenden Schritte in einer Datei, z. B. unter dem Namen wp-content/mu-plugins/hide-wp-version.php.
Schritt 3: Generator-Tag und die Version in ver= verbergen
<?php
/**
* Plugin Name: Hide WordPress Version
* Description: Verbirgt die WordPress-Version im Generator-Tag und in ver= von CSS und JS.
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
// Das <meta name="generator"> im HTML und das <generator> im Feed leeren.
add_filter( 'the_generator', '__return_empty_string' );
/**
* Nur wenn ver= in CSS/JS der WordPress-Version entspricht, durch einen anderen Wert ersetzen.
* ver= wird nicht entfernt, sondern ersetzt, damit der Browser-Cache nach einem WordPress-Update aktualisiert wird.
*/
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 );
Die wichtigsten Punkte:
- Der Filter
the_generatorwirkt sowohl auf das Generator-Tag im HTML als auch auf den Generator im Feed.remove_action( 'wp_head', 'wp_generator' );entfernt nur das Tag im HTML und wirkt daher nicht auf den Feed - Wenn Sie jedes
?ver=entfernen, nutzt der Browser nach einem Update von Plugins oder Themes unter Umständen weiter alte CSS- und JS-Dateien. Der obige Code ersetzt nur Werte, die der WordPress-Version entsprechen, durch eine aus der Version erzeugte andere Zeichenkette. Bei einem WordPress-Update ändert sich auch dieser Wert, sodass der Cache aktualisiert wird ver=-Angaben, bei denen Plugins oder Themes eine eigene Versionsnummer setzen, bleiben unverändert
Prüfen Sie nach dem Speichern mit den Befehlen aus Schritt 1, dass kein Generator mehr erscheint und in der ver=-Liste keine WordPress-Version mehr steht. Wenn Sie Cache-Plugins verwenden, leeren Sie vor der Prüfung den Cache.
Schritt 4: Den Header X-Powered-By abschalten
X-Powered-By ist ein Header, den nicht WordPress, sondern PHP setzt, und er verrät die PHP-Version. Zum Abschalten setzen Sie in der PHP-Konfigurationsdatei (php.ini) expose_php auf Off. Diese Einstellung lässt sich nur in der php.ini ändern.
expose_php = Off
Ein Beispiel für einen VPS mit Ubuntu und PHP-FPM (8.3 passen Sie an Ihre PHP-Version an).
# Aktuelle Einstellung prüfen
grep -n '^expose_php' /etc/php/8.3/fpm/php.ini
# Nach dem Ändern PHP-FPM neu starten
sudo systemctl restart php8.3-fpm
Die php.ini des Ubuntu-Pakets hat im Ausgangszustand expose_php = Off. Wird der Header trotzdem ausgegeben, prüfen Sie, ob eine andere php.ini verwendet wird. Bei Mietservern lässt sich dies teils in der PHP-Einstellung der Verwaltungsoberfläche ändern, teils nicht.
Wenn Sie die php.ini nicht ändern können, lässt sich der Header auch per WordPress-Code entfernen. Allerdings wird send_headers nur ausgelöst, wenn WordPress Seiten für das Frontend ausgibt, sodass es für Admin- und Login-Seiten nicht wirkt.
add_action( 'send_headers', function () {
header_remove( 'X-Powered-By' );
} );
Schritt 5: Den Zugriff auf readme.html und license.txt verweigern
readme.html und license.txt sind Dateien des WordPress-Kerns. In der aktuellen readme.html steht keine Versionsnummer, aber man erkennt daran, dass WordPress verwendet wird.
Auch wenn Sie die Dateien löschen, kommen sie bei einem Update des WordPress-Kerns zurück. Es ist weniger Aufwand, den Zugriff auf Webserver-Ebene zu verweigern, als sie zu löschen.
Bei Apache (.htaccess)
Ergänzen Sie die .htaccess im WordPress-Ordner. Der Bereich zwischen # BEGIN WordPress und # END WordPress wird von WordPress überschrieben, schreiben Sie also außerhalb davon. Dies ist die Schreibweise für Apache 2.4 (Order und Deny from all sind die alte Schreibweise von Apache 2.2).
<FilesMatch "^(readme\.html|license\.txt)$">
Require all denied
</FilesMatch>
Bei Nginx
Ergänzen Sie den server-Block der Website, prüfen Sie die Konfiguration und laden Sie sie neu.
location ~* ^/(readme\.html|license\.txt)$ {
deny all;
}
sudo nginx -t && sudo systemctl reload nginx
Führen Sie nach dem Ergänzen curl -s -o /dev/null -w '%{http_code}\n' https://example.com/readme.html aus und prüfen Sie, dass 403 zurückkommt.
Was auch das Verbergen nicht verhindert
- Der Inhalt der CSS- und JS-Dateien von WordPress unterscheidet sich von Version zu Version leicht, sodass sich die Version durch Abrufen und Vergleichen der Dateien erschließen lässt
- Aus
readme.txtoderver=von Plugins und Themes lässt sich mitunter die Plugin-Version erkennen. Angegriffen werden häufiger Schwachstellen in Plugins als im Kern - Für Personen, die sich im Admin-Bereich anmelden können, wird die Version weiterhin wie bisher angezeigt
Aktualisieren Sie deshalb zusätzlich zum Verbergen der Version Kern, Plugins und Themes, entfernen Sie nicht genutzte Plugins und deaktivieren Sie die Dateibearbeitung im Admin-Bereich.
Fazit
- Die Version wird vor allem im Generator von HTML und Feed sowie in
?ver=bei CSS und JS angezeigt. Die REST API unter/wp-json/enthält keine WordPress-Version - Mit
add_filter( 'the_generator', '__return_empty_string' );entfernen Sie den Generator in HTML und Feed gleichermaßen ?ver=entfernen Sie nicht, sondern ersetzen nur Werte, die der WordPress-Version entsprechen. So wird die Cache-Aktualisierung nicht blockiertX-Powered-Byschalten Sie mitexpose_php = Offin der php.ini abreadme.htmlkommt nach einem Update auch nach dem Löschen zurück, verweigern Sie daher den Zugriff auf dem Webserver- Das Verbergen ist nur eine Zusatzmaßnahme; am wichtigsten bleibt, laufend zu aktualisieren
Ähnliche Artikel:
- Security-Header in WordPress einrichten | getrennt für .htaccess, Nginx und functions.php
- So beschränken Sie den Zugriff auf die WordPress REST API
- Den Datei-Editor für Themes und Plugins in WordPress deaktivieren | DISALLOW_FILE_EDIT
Fragen zu WordPress? Der Betreiber dieser Seite sitzt in Japan und antwortet auf Japanisch. Kontakt (Japanisch)