WordPress »User Enumeration« verhindern
In diesem Beitrag stellen wir euch ein Snippet bereit, womit ihr die »User Enumeration« in WordPress verhindern könnt.

In vielen WordPress-Installationen ist es kein großes Problem die Benutzernamen der registrierten Benutzer in Erfahrung zu bringen. Das ist vor allem ein Problem in Bezug auf die Sicherheit der Website, da so schon die erste Hürde für einen Angriff überwunden ist. In diesem Beitrag stellen wir euch ein Snippet bereit, mit dem ihr verhindern könnt, dass die Benutzernamen ausgelesen werden können.
Wie funktioniert die WordPress »User Enumeration«?
Eine simple Möglichkeit in einer ungeschützten WP-Installation die Benutzernamen auszulesen, erfolgt über die URL. WordPress stellt standardmäßig in der Template-Hierachie Seitentypen für Autoren bereit (author.php
). Wenn die author.php
nicht vorhanden sein sollte, sucht WordPress nach dem übergeordneten Template, bis irgendwann die index.php
einspringt. Es ist daher nicht möglich, dass es kein Template für die Ansicht von Autoren gibt.
Mit folgender URL ruft man besagte Autorenseite für den Benutzer mit der ID 1 auf: https://domain.de
/?author=1.
Der Benutzer mit der ID 1 wird bei der Installation von WordPress angelegt – die Wahrscheinlichkeit, dass es sich um einen Administrator handelt ist daher sehr groß.
Wenn nun in WordPress sprechende URLs eingestellt sind, so springt die URL bei der Eingabe der oben genannten Adresse automatisch auf eine Struktur wie diese um: https://domain.de/author/admin
. Und schon ist der Benutzername bekannt.
Aufruf der Benutzer-URL über ID verhindern
Um die »User Enumeration« in WordPress zu verhindern, müsst ihr folgendes Snippet in eure functions.php
oder in ein seitenspezifisches Plugin einfügen. Anschließend kann über die ID nicht mehr der Benutzername ausgelesen werden.
<?php
if ( ! is_admin() && isset($_SERVER['REQUEST_URI'])){
if(preg_match('/(wp-comments-post)/', $_SERVER['REQUEST_URI']) === 0 && !empty($_REQUEST['author']) ) {
wp_die('Du hast keine Rechte diese Adresse aufzurufen');
}
}
?>
Um zu testen, ob eure Anpassung erfolgreich war, könnt ihr nun einfach eure Domain mit dem Anhang /?author=1
in die Adresszeile eures Browsers eingeben. Anschließend solltet ihr folgende Meldung erhalten:

Bitte beachtet, dass es viele Themes gibt, die das o.g. Autoren-Template bewusste verlinken um Autoren-Seiten zu bilden. In diesem Fall erreicht man die URL trotzdem.
Benutzernamen aus Autor-CSS-Klasse der Kommentare entfernen
Schreibt ihr auf eurer Website einen Kommentar als Autor, schreibt WordPress eine »Autor-CSS-Klasse« in den Kommentar. Diese Klasse sieht wie folgt aus: comment-author-[USERNAME]
. Um diese Klasse zu entfernen, müsst ihr folgendes Snippet in eure functions.php
übernehmen.
<?php
function kb_remove_comment_author_class( $classes ) {
foreach( $classes as $key => $class ) {
if(strstr($class, "comment-author-")) {
unset( $classes[$key] );
}
}
return $classes;
}
add_filter( 'comment_class' , 'kb_remove_comment_author_class' );
?>
WordPress REST API schließen
Über die REST API von WordPress lassen sich ebenfalls die Benutzernamen der Autoren auslesen. Solltet ihr die REST API also nicht verwenden, könnt ihr die Schnittstelle schließen. Da viele Editoren (u.a. der WordPress Block Editor) die API im Backend benötigen, solltet ihr die Deaktivierung auf das Frontend begrenzen oder nur einzelne Rounten schließen. Schreibt dazu folgendes Snippet in eure functions.php
.
<?php
function kb_disable_wp_rest_api($access) {
// Überprüfung, ob der Benutzer im Admin-Bereich (Backend) ist
if (is_user_logged_in() || is_admin()) {
return $access; // Zugriff erlauben
}
// REST-API für nicht eingeloggte Benutzer deaktivieren
return new WP_Error('rest_API_cannot_access', __('REST API access is restricted.'), array('status' => rest_authorization_required_code()));
}
// Filter für die REST-API-Authentifizierung setzen
add_filter('rest_authentication_errors', 'kb_disable_wp_rest_api');
?>
WordPress-Benutzernamen aus Login-Maske entfernen
Auch in der Login-Maske von WordPress kann der Benutzername auftauchen. Dazu haben wir hier bereits einen Beitrag veröffentlicht.
Bitte beachtet, dass es sich bei allen hier genannten Möglichkeiten um Verschleierungs-Methoden handelt.
Vielen Dank für diesen tollen Blog-Beitrag!
Ich habe den Codeblock unter „WordPress REST API schließen“ gestern in meine function.php des Child-Themes eingebaut und heute festgestellt, dass dadurch der Editor von Elementor nicht mehr lädt (der ewige Wartekreisel). Die Seite (Frontend) wurde normal angezeigt.
Es scheint so, als würde Elementor mit dieser API im Hintergrund etwas prüfen. Sobald ich den Codeblock auskommentiert habe, wurde der Editor wieder normal geladen.
Ich habe zwei Stunden gebraucht, um den Fehler einzugrenzen, da ich das nach Problem erst nach dem heutigen Plugin-Update entdeckte und dachte, es läge daran. Das Fehlerbild ist sehr interessant und deine Funktion ist überaus nützlich.
So wie sie jetzt ist, verhindert der Rückgabewert der Funktion kb_disable_wp_rest_api() das Laden des Editors, weil sie etwas unerwartetes zurück gibt.
Wenn man in Erfahrung bringen könnte, was der Elementor-Editor über dieses von deiner Funktion deaktivierte Rest-API erwartet, könnte man die Funktion so erweitern, dass sie z. B. Anfragen von localhost (Elementor-Plugin) durch lässt und nur etwas von außen blockt. Nur so als Anregung.
Viele Grüße aus Erfurt!
Sven
Hallo Sven, in diesem Fall darfst du nicht alle Endpunkte der REST API schließen, sondern nur die, die nicht genutzt werden oder die Funktion schließt das Backend aus. Ich habe das Snippet und die dazu passende Passage im Blog-Post aktualisiert.
Vielen Dank für diesen ausführlichen Beitrag, der mein Problem i. W. löst. Was müßte in dem ersten php-Code ergänzt werden um nicht die o. a. Fehlermeldung „Du hast keine Rechte…“ anzuzeigen, sondern direkt auf die Startseite (Home URL) umzuleiten und dies ohne weitere Meldungen?
Hey ho,
wenn ich die Funktion „kb_disable_wp_rest_api“ meiner functions.php hinzufüge fünktioniert mein Kontaktformular (CF7) nicht mehr.
Gibt es das eine Lösung, Workaround für?
Das von dir beschriebene Problem war mir nicht bekannt – da wir nicht mit CF7 arbeiten. Aber CF7 scheint generell Ärger zu machen wenn die Rest API geschlossen wird! Siehe hier.
Das ist mal eine geniale Anleitung für ein Problem mit/bei WordPress das mich schon seit längerem gestört hat. Da ich jedoch nicht so in dem Maße im Programmieren bewandert bin, konnte ich dieses Problem bisher nicht selbst lösen.
Danke somit für diese gut geschriebene Anleitung.
Enumeration, was für ein Wort.
Musste erst mal selbst suchen um herauszufinden was sich hinter diesem umständlichen Begriff genau verbirgt.
Deutsche Sprache, schwere Sprache. ;-)
Wenn man die REST API offen lässt, dann nützt das herzlich wenig. ;)
https://blog.kulturbanause.de//wp-json/wp/v2/users
Und es gibt noch viele weitere Möglichkeiten den Benutzernamen preiszugeben:
http://torstenlandsiedel.de/2016/02/28/sicherheitsmythos-anmeldenamen-in-wordpress-verstecken/
Zwei-Faktor-Autorisierung ist hier deutlich sinnvoller als solche Schein-Lösungen, die keine echte Sicherheit bringen.
Hallo Torsten,
besten Dank für deinen Kommentar – die Rest API ist jetzt übrigens auch bei uns zu ;). Wir haben den Beitrag entsprechend angepasst. Zum Login-Screen und der 2-Faktor-Authentifizierung hatten wir in der Vergangenheit bereits geschrieben.