web-dev-qa-db-ja.com

WordPress 4.7.1 REST まだユーザーを公開しているAPI

私はWordPressを4.7.1にアップグレードしました、そしてその後私はREST AP​​Iを通してユーザーを列挙しようとしました、そしてそれは修正されるべきでした、しかし私はユーザーを検索することができました。

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 AP​​Iは、パブリック投稿タイプの投稿を作成したすべてのユーザーのユーザーデータを公開しました。 WordPress 4.7.1では、これをREST AP​​I内に表示するように指定した投稿タイプのみに制限しています。 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

それを無効にすることはお勧めできません。

28
mirsad

このコードスニペットを使用すると、ユーザーリストが非表示になり、結果として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 AP​​Iエンドポイントをすべて削除するには、次のコードを追加する必要があります。

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

21
BlueSuiter

必要に応じて、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;
    }

さらなるテクニックについては記事全体をチェックしてください。

1
lowtechsun

あなたはnginx/Apache configを通してそれを修正することができます。

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