여전히 사용자를 노출시키는 WordPress 4.7.1 REST API


28

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이보고 함.

plugin 설치 후 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

그 기능을 비활성화하는 것은 좋은 생각이 아닙니다.


7
내 이해로, 변경 로그는 사용자가 더 이상 노출되지 않는다고 말하지 않습니다. "노출은 REST API를 통해 노출되도록 설정된 게시물 유형을 작성한 사용자로 제한됩니다."라고 읽어야한다고 생각합니다. 따라서 사용자가 공개 형식과 대조적으로 노출되는 게시물 유형에 대한 게시물을 작성하는 즉시 작성자도 노출됩니다.
JHoffmann

아마이 링크가 도움이 될 수 있습니다 : wordpress.stackexchange.com/questions/228585/…
Pablo

답변:


22

이 코드 스 니펫을 사용하면 사용자 목록을 숨기고 결과로 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 리포지토리 에서이 링크 를 참조하십시오 .

::최신 정보::

모든 기본 REST API 엔드 포인트를 제거하려면 다음 코드를 추가해야합니다.

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


참조 링크에 따라 엔드 포인트를 필터링 할 수도 있습니다.
BlueSuiter

1
이것이 지금까지 가장 좋은 솔루션입니다.
mirsad

이 사용자 정의 코드는 어디에 있습니까? 저장 위치는 언급하지 않았습니다.
wruckie

이것을 functions.php테마로 유지할 수 있습니다 .
BlueSuiter

이 솔루션은 사용자의 모든 CRUD 작업을 비활성화합니다. GET 요청에 대해서만이 구현을 참조하십시오. github.com/szepeviktor/wordpress-fail2ban/commit/…
Szépe Viktor

2

원하는 경우 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

nginx / apache 설정을 통해 수정할 수 있습니다 :

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

-1

이 문제를 해결하려면 먼저 문제의 원인을 알아야합니다.

  1. 하나의 SEO 팩 또는 Yoast와 같은 SEO 플러그인을 사용합니까? 이것을 비활성화하고 다시 확인하십시오.
  2. Jetpack 플러그인을 사용하십니까? 이것을 비활성화하고 다시 확인하십시오.

이것이 당신에게 올바른 방향을 알려주 었는지 알려주십시오.

이 문제를 해결하는 더러운 방법은 .htacces 아래의 URL을 차단하는 것입니다. https://mywebsite.com/wp-json/wp/v2/users

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.