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. Schreibt dazu folgendes Snippet in eure functions.php
.
<?php
function kb_disable_wp_rest_api($access) {
return new WP_Error( 'rest_API_cannot_access', array( 'status' => rest_authorization_required_code() ) );
return $access;
}
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 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.