Wordpress Headless

La API REST de WordPress se introdujo en el núcleo de WordPress a finales de 2016 con el lanzamiento de WordPress 4.7. Como todos los grandes cambios que aparecen en una plataforma, la API REST generó controversia en algunos e indiferencia en otros.

Asegurar la API REST de WordPress

Por defecto la API REST está activada, dejando expuestos muchos detalles del sitio web. Para ver dichos detalles, basta con adjuntar al final de la URL del dominio el fragmento /wp-json/ y acceder a dicha dirección. Dentro de /wp-json/ hay dos apartados interesantes:

  • /wp-json/wp/v2/users: El resultado obtenido es un JSON con los datos de los usuarios del sitio web e incluye el ID de usuario, este dato suele ocultarse como medida de seguridad y para evitar posibles ataques.

  • /wp-json/wp/v2/posts: El resultado obtenido es una lista con las últimas publicaciones. Esto implica que si el sitio web tiene contenido protegido al que solo pueden acceder ciertos usuarios (de pago o con diferentes planes de suscripciones) dicho contenido estará expuesto públicamente a través de la API REST.

La API REST se puede usar para recuperar los datos de un sitio web mostrarlos en otro lugar en un formato diferente. También se puede usar para controlar un sitio web de forma remota, enviando comandos como crear, actualizar y eliminar (CRUD) y pueden usarlos de la siguiente manera:

  • Publicaciones.

  • Publicar revisiones.

  • Categorías.

  • Etiquetas.

  • Páginas.

  • Comentarios.

  • Taxonomías.

  • Contenido multimedia.

  • Usuarios.

  • Tipos de publicaciones.

  • Publicar estados.

  • Configuración.

Por tanto la API REST solo debería estar activada para desarrolladores y/o usuarios concretos. Algunas formas de mejorar la seguridad de la API REST de WordPress son:

  • Habilitar la API REST solo a usuarios registrados: Todos aquellos usuarios que no hayan iniciado sesión en el sitio web no tendrán acceso a ella.

    <?php 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', 'You are not currently logged in.', array( 'status' => 401 ) ); } return $result; });

    Como resultado de este código, cuando un usuario que no haya iniciado sesión en el sitio web intente acceder, recibirá un mensaje de error debido a que ahora está protegido el contenido.

  • Habilitar la API REST solo a administradores: Todo aquel usuario que no pertenezca al perfil administrador no tendrá acceso a ella.

    <?php 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', 'You are not currently logged in.', array( 'status' => 401 ) ); } if ( ! current_user_can( 'administrator' ) ) { return new WP_Error( 'rest_not_admin', 'You are not an administrator.', array( 'status' => 401 ) ); } return $result; });

    Se ha añadido una nueva comprobación: current_user_can. Si se quiere controlar otro rol símplemente habría que añadir otra comprobación para dicho rol.

  • Uso de complementos para deshabilitar la API REST: Hay varios complementos que permiten deshabilitar la API REST de WordPress, uno de los más recomendados es Disable REST API.

 

Por defecto, este complemento ya evita que usuarios no registrados accedan a la API REST de WordPress. Y además permite seleccionar qué rutas están activas y cuáles se desean deshabilitar en el sitio web.

  • Crear listas blancas de complementos permitidos: Algunos complementos de WordPress necesitan la API REST para funcionar, en ese caso se debe de crear una lista blanca de complementos, IPs, etc. que estén autorizados a usarla. De esta manera, todo complemento, IP, etc. que no esté en la lista blanca no tendrá acceso a ella.

  • Deshabilitar por completo la API REST: Una solución más drástica es deshabilitar por completo la API REST  de WordPress.

    add_filter('rest_enabled', '_return_false'); add_filter('rest_jsonp_enabled', '_return_false');

     

Referencias

https://www.wpwhitesecurity.com/wordpress-rest-api-and-the-security-worries/
https://premium.wpmudev.org/blog/wordpress-rest-api-security
https://wpcerber.com/restrict-access-to-wordpress-rest-api/
https://neliosoftware.com/blog/protect-your-wordpress-by-hiding-the-rest-api/