Die REST-API von WordPress 4.7.1 macht Benutzer weiterhin verfügbar

28

Ich habe mein WordPress auf aktualisiert 4.7.1, und danach habe ich versucht, Benutzer über die REST-API aufzulisten, was behoben werden sollte, aber ich konnte Benutzer abrufen.

https://mywebsite.com/wp-json/wp/v2/users

Ausgabe:

[{"id":1,"name":"admin","url":"","description":"","link":"https:\/\/mywebsite\/author\/admin\/","slug":"admin","avatar_urls":{"24": ...

Änderungsprotokoll der neuesten Version:

Die REST-API enthüllte Benutzerdaten für alle Benutzer, die einen Beitrag eines öffentlichen Beitragstyps verfasst hatten. WordPress 4.7.1 beschränkt dies nur auf Beitragstypen, die angegeben haben, dass sie in der REST-API angezeigt werden sollen. Berichtet von Krogsgard und Chris Jean.

Nach der Installation des Plugins Disable REST APIscheint alles in Ordnung zu sein, aber ich verwende es nicht gerne für jedes kleine Plugin.

Die Ausgabe nach Verwendung des Plugins ist:

{"code":"rest_cannot_access","message":"Only authenticated users can access the REST API.","data":{"status":401}}

Wie kann ich dieses Problem beheben, ohne ein Plugin zu verwenden, oder warum gibt es dieses Problem auch nach dem Upgrade?

EDIT 30.9.2017

Mir ist aufgefallen, dass es einen Konflikt zwischen dem contact 7Plugin und Disable REST APIgibt, der zu 401 unauthorizedFehlern führen kann.

Wenn Sie versuchen, eine Nachricht über das contact 7Formular zu senden , wird eine Anfrage gestellt

wp-json/contact-form-7/v1/contact-forms/258/feedback

und das Deaktivieren ist keine gute Idee.

Mirsad
quelle
7
Nach meinem Verständnis besagt das Changelog nicht, dass Benutzer nicht mehr exponiert werden. Ich denke, es sollte gelesen werden als "Exposure wird auf Benutzer beschränkt, die Beitragstypen verfasst haben, die so eingestellt sind, dass sie über die REST-API verfügbar gemacht werden." Sobald ein Benutzer einen Beitrag für einen Beitragstyp verfasst, der verfügbar gemacht wird (im Gegensatz zu der Tatsache, dass er nur öffentlich ist), wird der Autor ebenfalls verfügbar gemacht.
JHoffmann
Vielleicht könnte dieser Link Ihnen helfen: wordpress.stackexchange.com/questions/228585/…
Pablo

Antworten:

22

Verwenden Sie dieses Code-Snippet, um die Benutzerliste auszublenden und 404 als Ergebnis zu erhalten, während die restlichen API-Aufrufe so weiterlaufen, wie sie waren.

add_filter( 'rest_endpoints', function( $endpoints ){
    if ( isset( $endpoints['/wp/v2/users'] ) ) {
        unset( $endpoints['/wp/v2/users'] );
    }
    if ( isset( $endpoints['/wp/v2/users/(?P<id>[\d]+)'] ) ) {
        unset( $endpoints['/wp/v2/users/(?P<id>[\d]+)'] );
    }
    return $endpoints;
});

Sie können auf diesen Link auf gitHub repo von WP_REST_API verweisen, um weitere Details dazu zu erfahren.

::AKTUALISIEREN::

Um alle Standard-REST-API-Endpunkte zu entfernen, müssen Sie folgenden Code hinzufügen:

<?php remove_action('rest_api_init', 'create_initial_rest_routes', 99); ?>

BlueSuiter
quelle
Über den angegebenen Link können Sie auch die Endpunkte
herausfiltern
1
Dies ist die bisher beste Lösung.
Mirsad
Wohin geht dieser benutzerdefinierte Code? Sie erwähnen nicht, wo dies gespeichert werden soll.
Wruckie
Sie können dies in functions.phpIhrem Thema behalten .
BlueSuiter
Diese Lösung deaktiviert alle CRUD-Vorgänge für Benutzer. Diese Implementierung gilt nur für GET-Anforderungen: github.com/szepeviktor/wordpress-fail2ban/commit/…
Szépe Viktor
2

Entfernen Sie den API-Link aus dem HTML-Kopf, wenn Sie möchten.

// https://wordpress.stackexchange.com/a/211469/77054
// https://wordpress.stackexchange.com/a/212472
remove_action( 'wp_head', 'rest_output_link_wp_head', 10 );

Dann fordern Sie für alle Anfragen eine Authentifizierung an.

// You can require authentication for all REST API requests by adding an is_user_logged_in check to the rest_authentication_errors filter.
add_filter( 'rest_authentication_errors', function( $result ) {
    if ( ! empty( $result ) ) {
        return $result;
    }
    if ( ! is_user_logged_in() ) {
        return new WP_Error( 'rest_not_logged_in', 'Only authenticated users can access the REST API.', array( 'status' => 401 ) );
    }
    return $result;
});

Dies wird Sie mit der gewünschten Nachricht verlassen.

Um die Aufzählung zu stoppen, könnten Sie so etwas verwenden.

// https://perishablepress.com/stop-user-enumeration-wordpress/
// block WP enum scans
    // https://m0n.co/enum
    if (!is_admin()) {
        // default URL format
        if (preg_match('/author=([0-9]*)/i', $_SERVER['QUERY_STRING'])) die();
        add_filter('redirect_canonical', 'shapeSpace_check_enum', 10, 2);
    }
    function shapeSpace_check_enum($redirect, $request) {
        // permalink URL format
        if (preg_match('/\?author=([0-9]*)(\/*)/i', $request)) die();
        else return $redirect;
    }

Schauen Sie sich den ganzen Beitrag für weitere Techniken an.

Lowtechsun
quelle
1

Sie können das Problem mit nginx / apache config beheben:

location ~* /wp-json/wp/v2/users {
        allow ip_address;
        deny all;
}
vim
quelle
-1

Um dies zu beheben, müssen Sie zunächst die Ursache des Problems kennen.

  1. Verwenden Sie SEO-Plugins wie: Alles in einem SEO-Paket oder Yoast? Versuchen Sie dies zu deaktivieren und überprüfen Sie es erneut.
  2. Verwenden Sie das Jetpack-Plugin? Versuchen Sie dies zu deaktivieren und überprüfen Sie es erneut.

Bitte lassen Sie mich wissen, wenn dies Sie in die richtige Richtung wies.

Ein schmutziger Weg, dies zu lösen, besteht darin, die URL in Ihren .htacces zu blockieren. https://mywebsite.com/wp-json/wp/v2/users

Foo
quelle