Die REST-API ist heute ein Kernbestandteil von WordPress: Block-Editor, Site Editor, viele Plugins und die KI-Infrastruktur (Abilities) nutzen sie. Sie komplett abzuschalten bricht deshalb mehr, als es schützt. Ziel ist eine gezielte Einschränkung.
Was öffentlich ist
Ohne Login liefert die REST-API standardmässig nur, was ohnehin öffentlich ist: veröffentlichte Beiträge, Seiten, Kategorien sowie Benutzer, die öffentliche Beiträge verfasst haben. Letzteres verrät Benutzernamen (Slugs) für Login-Angriffe.
Benutzer-Enumeration verhindern
add_filter( 'rest_endpoints', function ( array $endpoints ): array {
if ( ! is_user_logged_in() ) {
unset( $endpoints['/wp/v2/users'], $endpoints['/wp/v2/users/(?P<id>[\d]+)'] );
}
return $endpoints;
} );
// Autoren-Scans (?author=1) umleiten
add_action( 'template_redirect', function () {
if ( is_author() && isset( $_GET['author'] ) ) {
wp_safe_redirect( home_url(), 301 );
exit;
}
} );
Zusätzlich sicherstellen, dass Benutzername und öffentlicher Anzeigename verschieden sind; der Slug in Autoren-URLs basiert auf user_nicename.
REST-API nur für angemeldete Benutzer
Für reine Unternehmens-Websites ohne Headless-Frontend und ohne öffentliche REST-Nutzung:
add_filter( 'rest_authentication_errors', function ( $result ) {
if ( true === $result || is_wp_error( $result ) ) { return $result; }
if ( ! is_user_logged_in() ) {
return new WP_Error( 'rest_forbidden', 'REST API nur für angemeldete Benutzer.', [ 'status' => 401 ] );
}
return $result;
} );
Vorher testen: Kontaktformulare, Suchfunktionen, Shop-Funktionen (WooCommerce Store API für Block-Checkout!), Embeds und Apps können öffentliche Endpunkte benötigen. Gezielte Ausnahmen per Routen-Präfix einbauen.
Eigene Endpunkte sicher bauen
register_rest_route( 'flake/v1', '/report', [
'methods' => 'POST',
'callback' => 'flake_report',
'permission_callback' => fn() => current_user_can( 'edit_posts' ),
'args' => [ 'id' => [ 'type' => 'integer', 'required' => true, 'minimum' => 1 ] ],
] );
Ein fehlender oder auf __return_true gesetzter permission_callback ist eine der häufigsten Ursachen für Plugin-Schwachstellen.
XML-RPC
XML-RPC ist der Vorgänger der REST-API. Ausser Jetpack und einzelnen älteren Apps nutzt es kaum noch etwas. Wenn nicht benötigt, auf Webserver-Ebene sperren (siehe Brute-Force-Schutz). Wird Jetpack eingesetzt, kann der Zugriff auf die IP-Bereiche von Automattic beschränkt werden.
Application Passwords
Ermöglichen REST-Zugriff per Basic Auth und umgehen 2FA. Nur aktivieren, wo sie gebraucht werden, eines pro Integration anlegen und ungenutzte widerrufen.
Weiterführende Artikel
- Brute-Force- und Credential-Stuffing-Schutz für wp-login.php und XML-RPC
- Benutzerrollen, Berechtigungen und das Least-Privilege-Prinzip
- Eigene Abilities registrieren: Plugins KI-fähig machen