Die aktuelle c’t 23.2020 widmet sich den Sicherheitslücken. Eine „Lücke“ ist die Rest-API von WordPress. Die WordPress REST API ist eine Schnittstelle, mit der Entwickler von außerhalb der WordPress-Installation selbst auf WordPress zugreifen können. Der Zugriff erfolgt über JavaScript, d.h. es können damit interaktive Webseiten und Apps erstellt werden.
Die Rest-API wird über www.domain.tld/wp-json aufgerufen. Folgend ein paar Beispiele was man da alles abrufen kann:
- /wp-json/wp/v2/media
- /wp-json/wp/v2/pages
- /wp-json/wp/v2/comments
- /wp-json/wp/v2/users
Dies ist grundsätzlich nicht ein Problem. Allerdings können je nach Konstellation dadurch durchaus Daten ausgelesen werden, welche nicht für fremde Augen bestimmt sind. Nun gibt es verschiedene Plugins oder auch Snippets um die API zu deaktivieren:
add_filter( 'rest_authentication_errors', function( $result ) {
if ( ! empty( $result ) ) {
return $result;
}
if ( ! is_user_logged_in() ) {
return new WP_Error( '401', 'not allowed.', array('status' => 401) );
}
return $result;
});
Damit wird der Zugriff auf die IP auf eingeloggte User beschränkt. Nun ist das jedoch ein Problem. Setzt man z.B. das beliebte Plugin Contact Form 7 ein, kann ein Formular nur noch abgesendet werden, wenn der Webseitenbesucher auf der Seite angemeldet ist, da Contact Form 7 die Rest-API nutzt, um das Formular abzusenden.
Eine bessere Umsetzung zur Einschränkung der API ist folgender Ansatz, den ich in StackOverflow gefunden habe:
/*-----------------------------------------------------------------------------------*
/* Secure Rest API - Remove some endpoints for non logged in users *
/*-----------------------------------------------------------------------------------*
function myplugin_removes_api_endpoints_for_not_logged_in() {
if ( ! is_user_logged_in() ) {
// Removes WordPress endpoints:
remove_action( 'rest_api_init', 'create_initial_rest_routes', 99 );
// Removes Woocommerce endpoints
if ( function_exists('WC') )
remove_action( 'rest_api_init', array( WC()->api, 'register_rest_routes' ), 10 );
}
}
add_action('init', 'myplugin_removes_api_endpoints_for_not_logged_in');
In dieser Umsetzung wird nicht die gesamte API deaktiviert sondern die relevanten Daten von WordPress und Woocommerce entfernt, sofern der Webseitenbesucher nicht eingeloggt ist.