私はWordPressを4.7.1
にアップグレードしました、そしてその後私はREST APIを通してユーザーを列挙しようとしました、そしてそれは修正されるべきでした、しかし私はユーザーを検索することができました。
https://mywebsite.com/wp-json/wp/v2/users
出力:
[{"id":1,"name":"admin","url":"","description":"","link":"https:\/\/mywebsite\/author\/admin\/","slug":"admin","avatar_urls":{"24": ...
最新バージョンからの変更履歴
REST APIは、パブリック投稿タイプの投稿を作成したすべてのユーザーのユーザーデータを公開しました。 WordPress 4.7.1では、これをREST API内に表示するように指定した投稿タイプのみに制限しています。 KrogsgardとChris Jeanによる報告。
プラグインDisable REST API
をインストールした後、それはすべてうまくいっているようですが、私はすべてのささいなことに使うのは好きではありません。
プラグインを使用した後の出力は次のとおりです。
{"code":"rest_cannot_access","message":"Only authenticated users can access the REST API.","data":{"status":401}}
どうしたらプラグインを使わずにこの問題を解決できますか?それともアップグレード後でさえもなぜ存在しますか?
編集30.9.2017
私はcontact 7
プラグインとDisable REST API
の間に矛盾があることに気付きました、そしてそれはあなたに401 unauthorized
エラーを与えるでしょう。
contact 7
フォームを使ってメッセージを送信しようとすると、リクエストが送信されます。
wp-json/contact-form-7/v1/contact-forms/258/feedback
それを無効にすることはお勧めできません。
このコードスニペットを使用すると、ユーザーリストが非表示になり、結果として404が表示されますが、残りのapi呼び出しはそのまま実行されます。
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;
});
これに関する詳細については、WP_REST_APIのgitHubレポジトリのthis link を参照してください。
:: UPDATE ::
デフォルトのREST APIエンドポイントをすべて削除するには、次のコードを追加する必要があります。
<?php remove_action('rest_api_init', 'create_initial_rest_routes', 99); ?>
必要に応じて、HTMLヘッドからAPIリンクを削除してください。
// https://wordpress.stackexchange.com/a/211469/77054
// https://wordpress.stackexchange.com/a/212472
remove_action( 'wp_head', 'rest_output_link_wp_head', 10 );
その後、すべての要求に対して認証を要求します。
// 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;
});
これにより、希望のメッセージが表示されます。
列挙を止めるために、このようなものを使うことができます。
// 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;
}
さらなるテクニックについては記事全体をチェックしてください。
あなたはnginx/Apache configを通してそれを修正することができます。
location ~* /wp-json/wp/v2/users {
allow ip_address;
deny all;
}