WordPress 4.7.1 REST API, die weiterhin Benutzer aussetzt

Ich habe mein WordPress auf 4.7.1 aktualisiert, und danach habe ich versucht, Benutzer über REST API aufzulisten, die 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 letzten Version:

Die REST API hat Benutzerdaten für alle Benutzer verfügbar gemacht, die einen Beitrag eines öffentlichen Beitragstyps erstellt haben. WordPress 4.7.1 beschränkt dies nur auf Post-Typen, die angegeben haben, dass sie in der REST-API angezeigt werden sollen. Berichtet von Krogsgard und Chris Jean.

Nach dem Installieren des Plugins Disable REST API scheint es, dass alles gut funktioniert, aber ich mag es nicht für jedes kleine Plugin zu verwenden.

Die Ausgabe nach der 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 auch nach dem Upgrade noch existieren?

EDIT 30.9.2017

Ich erkannte, dass es einen Konflikt zwischen contact 7 Plugin und Disable REST API und das Ihnen 401 unauthorized Fehler geben wird.

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

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

und das Deaktivieren ist keine gute Idee.

Solutions Collecting From Web of "WordPress 4.7.1 REST API, die weiterhin Benutzer aussetzt"

Verwenden Sie dieses Code-Snippet, es wird die Benutzerliste ausblenden und 404 als Ergebnis geben, während der Rest der API-Aufrufe weiterhin so läuft 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[\d]+)'] ) ) { unset( $endpoints['/wp/v2/users/(?P[\d]+)'] ); } return $endpoints; }); 

Sie können auf diesen Link auf gitHub Repo von WP_REST_API für einige weitere Details verweisen.

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 ); 

Fordern Sie dann die Authentifizierung für alle Anfragen 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 nun die Aufzählung zu stoppen, könnte man 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; } 

Schau dir die ganze Post für weitere Techniken an.

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

  1. Verwenden Sie SEO Plugins wie: Alles in einem SEO Pack 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, ob Sie dadurch in die richtige Richtung weisen.

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

Sie brauchen nur eine von 2 folgenden Zeilen in function.php:

 remove_action( 'init', 'rest_api_init' ); // turns off everything remove_action( 'parse_request', 'rest_api_loaded' ); // silently turns off output of user info 

Der Code wurde getestet.

Dies deckt fast die functionalität des erwähnten Plugins ab.