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
So sehen dann die Daten aus, die daraufhin im Browser erscheinen: (nur etwas hübscher formatiert)
Die Ausgabe der Benutzernamen im JSON-Format
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.
5 Kommentare. Hinterlasse eine Antwort
Moin, ich habe das Plugin installiert // Ohne die Code Schnipsel!
Das Plugin macht leider nur Fehler – Es kann keine neue Seite mehr erstellt werden und einige Funktionen funktionieren nicht mehr!
Ich weiß, man benötigt dafür Logs 🙂
Ich hab mal was raus kopiert und ein wenig was gelöscht, was wichtig sein könnte!
[Sun Jan 22 17:51:18.802174 2023] [proxy_fcgi:error]
AH01071: Got error ‚PHP message: PHP Warning: foreach() argument must be of type array|object, null given in [..]/wp-includes/rest-api/class-wp-rest-server.php on line 891 PHP message: PHP Fatal error: Uncaught TypeError: array_merge(): Argument #1 must be of type array, null given in [..]/httpdocs/wp-includes/rest-api/class-wp-rest-server.php:1043 \nStack trace:\n#0 [..]/httpdocs/wp-includes/rest-api/class-wp-rest-server.php(1043): array_merge()\n#1 [..]/httpdocs/wp-includes/rest-api/class-wp-rest-server.php(990): WP_REST_Server->match_request_to_handler()\n#2 [..]/httpdocs/wp-includes/rest-api.php(535): WP_REST_Server->dispatch()\n#3 [..]/wp-includes/rest-api.php(2884): rest_do_request()\n#4 [internal function]: rest_preload_api_request()\n#5 [..]/httpdocs/wp-includes/block-editor.php(635): array_reduce()\n#6 [..]/httpdocs/wp-admin/edit-form-blocks.php(77): block_editor_rest_api_preload()\n#7 [..]/httpdocs/wp-admin/post-new.php(72): require(‚…‘)\n#8 {…‘, referer: https:///wp-admin/index.php (https:///wp-admin/index.php)
Seit 13.10.2022 besteht das Problem.. Aktuelle WordPress Version 22.01.2023 installiert!
WordPress 6.1.1
Gruß, Manfred
Hi,
Du solltest das NEUE Plugin installieren. Der Artikel macht eigentlich deutlich sichtbar klar, dass es ein Update gab. Mit der neuen Version und einer aktuellen PHP-Version (mindestens 7.xx, besser 8.xx) sollte das Problem behoben sein. Und danach eventuell den Browser-Cache löschen.
Ich habe das Plugin aktualisiert. Es sollten somit keine Probleme mehr auftauchen.
Auch von mir ein Danke! Und auch bei mir (Template „Jacqueline“ von Themerex) ist es nicht einsetzbar. Die Änderung der functions.php sperrt mich aus und das PlugIn produziert eine weiße Seite.
Vielen Dank – habe das Plugin installiert. Auf Websites, die ich mit DIVI erstellt habe, ist es leider nicht einsetzbar: Es können dann keine neuen Seiten mehr kreiert werden.