Die WordPress REST API ist eine wunderbare Sache und wird für viele WordPress-Funktionen benötigt. Allerdings ist sie auch eine Sicherheitslücke, denn potenzielle Angreifer können so wichtige Daten auslesen. Hier erfährst Du, wie Du dieses Sicherheitsproblem schliessen kannst.
Die REST-API bietet viele Möglichkeiten Inhalte auszulesen und diese können dann an externe Apps oder Websites übergeben werden. Dazu stellt die API strukturierte Daten (JSON) öffentlich zur Verfügung. Dazu gehören jedoch auch Daten, die man nicht gern für jedermann öffentlich abrufbar sehen möchte.
Weitere Interessante Beiträge zur Sicherheit
Das Problem: mit der WordPress REST API lassen sich Usernamen anzeigen
Mit einem einfachen Kniff können die Benutzernamen der User-Accounts von WordPress ausgelesen werden. Das stellt ein ernsthaftes Sicherheitsproblem dar, denn so benötigen eventuelle Angreifer nur noch das User-Passwort für einen Hack der betreffenden Website. Gibt man folgendes in den Browser folgendes ein, erhält man die Datei mit den Usernamen:
https://www.deine-website.de/wp-json/wp/v2/users
Deine Wettbewerber werden bei Google besser gefunden als Du?
Mit unserer laufenden SEO Betreuung wirst Du schnell bessere Rankings in Googles Suchergebnissen erreichen und so mehr Kunden gewinnen und mehr Umsatz erzielen.
So sehen dann die Daten aus, die daraufhin im Browser erscheinen: (nur etwas hübscher formatiert)
Hier sieht man unter »Slug« den Benutzernamen mit vielen weiteren Informationen. Da der Benutzername nun bekannt ist, kann ein Angreifer eine Brute-Force Attacke gegen den Adminbereich starten, um so das User-Passwort zu erhalten und in die Website eindringen zu können. Mit anderen Abfragen wiederum können die Inhalte von Seiten und Beiträgen ausgelesen werden. Das eignet sich dann perfekt für den Content-Diebstahl.
Weitere Informationen zum Thema
WordPress REST API ganz abschalten? Besser nicht!
Man könnte nun auf die Idee kommen, die WordPress REST-API ganz abzuschalten. Das sollte man jedoch auf keinen Fall tun, da viele WordPress-Funktionen ansonsten nicht mehr möglich sind.
Der Gutenberg-Editor (auch Block-Editor genannt) ist von der REST-API Schnittstelle abhängig und würde ohne sie nicht mehr funktionieren. Ebenfalls nutzen auch etliche Plugins diese Funktionalitäten der API. Daher ist es definitiv keine gute Idee, diese API komplett abzuschalten.
So geht es richtig: REST-API für externe Besucher deaktivieren
Wichtig ist, dass die Plugins und der Gutenberg-Editor die Funktionen aufrufen können, die sie benötigen. Daher sollte die API nur für externe Besucher deaktiviert werden. Im eingeloggten Zustand funktioniert dann alles wie gewohnt. Das folgende Snippet muss in die functions.php
des aktiven (Child-) Themes. Wie Du ein Child-Theme erstellst kannst Du hier nachlesen.
Mit diesem Code Snippet schaltest Du die Schnittstelle für externe Besucher ab:
<?php
/* Ab hier kopieren */
/**
* REST-API fuer extere User abschalten
*/
add_filter('rest_authentication_errors', function($result) {
if ( ! is_user_logged_in() ) {
return new WP_Error( 'rest_API_cannot_access', array( 'status' => rest_authorization_required_code() ) );
}
return $result;
});
Statt alles zu deaktivieren: Schalte einzelne Endpoints ab [Update 18.11.2022]
Alle Inhalte einer WordPress-Installation werden für die WordPress REST-API verfügbar gemacht. Das ist der Standard. Wie bereits oben erwähnt lassen sich damit auch die Inhalte der Beiträge, Seiten und die Kommentare auslesen. Dazu kommen noch die Website-Einstellungen und so weiter...
Mittels WordPress-Filter können wir jedoch genau bestimmen, was von außen abgerufen werden kann. Hier nutzen wir den Filter rest_endpoints
. Alles Wissenswerte dazu liest Du in der WordPress REST API Referenz.
Wir deaktivieren die API-Endpunkte für:
- Benutzernamen
- Einstellungen
- Seiteninhalte
- Beitragsinhalte
All diese Endpunkte werden nur für externe User deaktiviert. Im eingeloggten Zustand ist die Rest-API komplett aktiv.
Danach sind die Informationen nicht mehr in der API zu finden. Hier der Code dafür:
<?php
/* Ab hier kopieren */
/**
* REST-API Filter entfernt wichtige Informationen fuer den Zugriff von Aussen
* @link https://developer.wordpress.org/rest-api/reference/ REST-API Referenz
*/
add_filter('rest_endpoints', function ($endpoints) {
if ( ! is_user_logged_in() ) {
$endpoints_to_remove = array(
'users', /* Entfernt die User aus den Daten */
'settings', /* Entfernt die Website-Einstellungen aus den Daten */
'posts', /* Entfernt die Beitragsinhalte aus den Daten */
'pages' /* Entfernt die Seiteninhalte aus den Daten */
);
foreach ($endpoints_to_remove as $endpoint) {
$base_endpoint = "/wp/v2/{$endpoint}";
foreach ($endpoints as $maybe_endpoint => $object) {
if (strpos($maybe_endpoint, $base_endpoint) !== false) {
unset($endpoints[$maybe_endpoint]);
}
}
}
return $endpoints;
}
});
WordPress REST API Sicherheitslücke deaktivieren: Plugin Download
Du kannst allerdings auch mein kleines Plugin installieren, was ich Dir erstellt habe. Es beinhaltet nur den Code, der die Informationen zu den Einstellungen, den Benutzernamen und den Inhalten der Seiten und Beiträge herausfiltert und macht Deine Website also nicht langsamer.