WordPress 4.7.1 REST API todavía expone a los usuarios

28

He actualizado mi WordPress a 4.7.1, y después de eso he intentado enumerar a los usuarios a través de la API REST, que debería solucionarse, pero pude recuperar a los usuarios.

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

Salida:

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

Registro de cambios de la última versión:

La API REST expuso los datos del usuario para todos los usuarios que habían creado una publicación de un tipo de publicación pública. WordPress 4.7.1 limita esto a solo los tipos de publicaciones que han especificado que deben mostrarse dentro de la API REST. Reportado por Krogsgard y Chris Jean.

Después de instalar el complemento Disable REST API, parece que todo funciona bien, pero no me gusta usarlo para cada pequeño complemento.

El resultado después de usar el complemento es:

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

¿Cómo puedo solucionar este problema sin usar el complemento, o por qué, incluso después de actualizar, todavía existe?

EDITAR 30.9.2017

Me di cuenta de que hay un conflicto entre el contact 7complemento Disable REST APIy eso te dará un 401 unauthorizederror.

Cuando intente enviar un mensaje a través del contact 7formulario, hará una solicitud

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

y deshabilitar eso no es una buena idea.

mirsad
fuente
77
Según tengo entendido, el registro de cambios no dice que los usuarios ya no se expongan. Creo que debería leerse como "La exposición se limita a los usuarios que han creado tipos de publicaciones que están configurados para ser expuestos a través de REST API". Entonces, tan pronto como un usuario crea una publicación para un tipo de publicación que se expone (en contraste con solo ser público), el autor también estará expuesto.
JHoffmann
Tal vez este enlace podría serle útil: wordpress.stackexchange.com/questions/228585/…
Pablo

Respuestas:

22

Use este fragmento de código, ocultará la lista de usuarios y dará 404 como resultado, mientras que el resto de las llamadas de la API siguen ejecutándose como estaban.

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

Puede consultar este enlace en el repositorio de gitHub de WP_REST_API para obtener más detalles sobre el mismo.

::ACTUALIZAR::

Para eliminar todos los puntos finales predeterminados de la API REST, debe agregar el siguiente código:

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

BlueSuiter
fuente
según el enlace referenciado, también puede filtrar los puntos finales ...
BlueSuiter
1
Esta es la mejor solución hasta ahora.
mirsad
¿A dónde va este código personalizado? No mencionas dónde se guardará esto.
wruckie
Puede mantener esto en functions.phpsu tema.
BlueSuiter
Esta solución deshabilita todas las operaciones CRUD en los usuarios, vea esta implementación solo para solicitudes GET: github.com/szepeviktor/wordpress-fail2ban/commit/…
Szépe Viktor
2

Elimine el enlace API del encabezado HTML si lo desea.

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

Luego requiera autenticación para todas las solicitudes.

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

Esto te dejará con el mensaje deseado.

Ahora, para detener la enumeración, podría usar algo como esto.

// 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;
    }

Echa un vistazo a toda la publicación para obtener más técnicas.

Lowtechsun
fuente
1

Puedes arreglarlo a través de nginx / apache config:

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

Para poder solucionar esto, primero debe conocer la fuente del problema.

  1. ¿Utiliza complementos de SEO como: Todo en un paquete de SEO o Yoast? Intente deshabilitar esto y verifique nuevamente.
  2. ¿Utiliza el complemento Jetpack? Intente deshabilitar esto y verifique nuevamente.

Avíseme si esto le indicó la dirección correcta.

Una manera sucia de resolver esto es simplemente bloquear la url debajo de tus .htacces. https://mywebsite.com/wp-json/wp/v2/users

Foo
fuente