Zum Hauptinhalt springen

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

Quellen und Dokumentation