Blog sobre desarrollo WordPress en Español Desarrollo WordPress en Español
Seguridad WordPress

Evitar la enumeración de usuarios en WordPress: bola extra

Hace unos meses escribí en dos entradas cómo evitar la enumeración de usuarios o user enumeration (parte 1 y parte 2). Ahora viene la bola extra: Evitar la enumeración de usuarios en WordPress a través de la REST API.

Como probablemente sabrás, WordPress integró en su core la REST API. El desarrollo de la REST API va a ser uno de los pilares fundamentales de evolución de WordPress, junto con el editor y el personalizador. No lo digo yo, lo dijo el propio Matt Mullenweg en el pasado State of the Word.

 

¿Cómo puedes listar los usuarios de un sitio WordPress a través de la REST API?

Pues es muy sencillo, basta con añadir /wp-json/wp/v2/users a un dominio de una web hecha en WordPress. Por ejemplo: http://eldominioquesea.com/wp-json/wp/v2/users y te mostrará algo tipo esto:

Simplemente con esta acción ya has obtenido el username de un sitio, o lo que es lo mismo: el 50% de lo que necesitas para acceder al escritorio de WordPress de una web.

 

¿Cómo evitamos listar usuarios con la REST API?

Pues por poder hacerlo podemos hacerlo, pero la pregunta es: ¿debemos hacerlo? Quizá hoy en día aún se puede decir que la REST API está dando sus primeros pasos, pero parece evidente que de aquí en adelante muchos desarrolladores de temas y plugins empezarán a hacer mucho uso de ella, por no hablar del core del propio WordPress.

Por lo tanto, antes de evitar listar los usuarios comprueba que ni tú, ni tu tema, ni tus plugins hagan uso de ella. Puestos ahora a deshabilitar la REST API tienes 2 opciones: hacerlo total o parcialmente. Y dentro de estas 2 opciones tienes 2 alternativas: añadiendo un pequeño código a tu functions.php o a través de plugins.

Para deshabilitar la REST API totalmente a partir de la versión 4.7 de WordPress bastaría con añadir este código al functions.php de tu tema:

Para deshabilitar la REST API parcialmente, es decir, en este caso deshabilitaremos los endpoints de users, el código que debemos añadir es el siguiente:

En cualquiera de estos dos casos podríamos enfocar esta restricción por ejemplo para usuarios no logueados, bastaría con añadir la condición if ( ! is_user_logged_in() ). O permitir el acceso a una determinada IP, o lo que se nos pueda ocurrir. Al hacerlo mediante código tenemos más control y podemos personalizarlo según nuestras necesidades.

Si te decantas por la opción vía plugins, para deshabilitar la REST API totalmente dispones en el repositorio de plugins de WordPress de uno llamado Disable REST API. Para el supuesto de querer deshabilitar sólamente los endpoints de users, dispones de un plugin llamado SMNTCS Disable REST API User Endpoints.

Puede que también te interese

Hacer una migración de dominio en WordPress sin perder posicionamiento
Hacer una migración de dominio en WordPress sin perder posicionamiento
En el artículo anterior vimos cómo migrar WordPress de hosting y de dominio. Puede darse el caso de que tu dominioantiguo.com estuviera bien posicionado y…
Cómo personalizar el logo y el enlace del login de WordPress
Cómo personalizar el logo y el enlace del login de WordPress
Éste es el aspecto que presenta la pantalla de login para acceder al back-end de nuestro WordPress: Es muy común que algún cliente nos pida…
No indexes las páginas de error 404
No indexes las páginas de error 404
En este post vamos a ver cómo indicar a los robots de búsqueda que no indexen las páginas de error 404 en WordPress. Un error 404…
Sácale partido al personalizador de WordPress
Sácale partido al personalizador de WordPress
Con este título he tenido el honor y el privilegio de participar como ponente en la WordCamp Santander 2016. El personalizador de WordPress apareció en…




  • León Guerra

    Hola Pablo. Si te es posible. Me gustaría obtener un code php para una función:

    Moderar usuarios (suscriptores) por ID.
    Por ejemplo, bloquear que el ID 22 pueda publicar comentarios por 10 días.

    • Hola Leon

      ¿Has buscado algún plugin en el repositorio que pueda servirte para este fin? No los he utilizado nunca, pero haciendo una búsqueda rápida hay algunos como BAN Users ó User Blocker que quizá puedan servirte.

      Saludos

      • León Guerra

        A mas plugins, mas vulnerabilidad. Y mas que algunos de esos estan desactualizados. Por eso me encanta usar codigo directo. Lo otro es, que algunos de esos plugin No hacen exactamente lo que uno necesita. Por eso me gustaria obtener esa function.

        • Si lo quieres desarrollar a mano, yo lo que haría es crear un usermeta para guardar la fecha de bloqueo de ese usuario.

          Después en los post que tengas los comentarios abiertos busca el hook que mejor se adapte a lo que necesitas (probablemente pre_comment_on_post ó comments_open) y bloquéalo retornando un false siempre que la fecha de hoy sea menor a la fecha de baneo del usuario.

          Saludos

          • León Guerra

            Está interesante eso que dices pero, no sé Php, 😀 a penas manejo un poco de Html y Css. Sin embargo, un plugin que sirva para banear como manda la Ley no existe.

            – Banear el login y que el usuario reciba un mensaje cuando lo intente (p. ej. su cuenta ha sido suspendida hasta fecha: , o su cuenta ha sido bloqueada definitivamente)
            – Banear solo comentar
            – Banear publicar actividad (buddypress, rtmedia)
            – Banear enviar mensajes privados o públicos (menciones) (bp)
            – Banear agregar amigos (bp)
            – Banear crear grupos o foros (bp, bbpress)

            – Botón Reportar (bp activity)
            . Reportar: Perfil (motivo: Perfil falso, Robo de indentidad)
            . Acoso
            . Spam
            . Contenido Ofensivo
            etc.

            Ya BuddyPress tiene años en el repositorio de WP, y tiene más de 200 mil instalaciones pero, todavía le falta, y ese plugin es uno de los faltantes.

      • León Guerra

        Le tire el Ojo a ese BAN Users, como te decia, cumple una funcion pero no es lo que necesito. Con ese BAN evitas que x usuario se loguee por x tiempo, pero no es eso lo que quiero. Sino que, pueda loguearse, ver el contenido, pero que no pueda p. ej. comentar o publicar. La idea es una funcion util para sitios con BuddyPress o BbPress. Esos otros plugins solo funcionan para WordPress Blog.

  • León Guerra

    Encontré otra vulnerabilidad que no sé como solucionarla, googleé buscando solución y nada.

    Si desde tu sitio WP se envía un mensaje (PhpMailer 5.xx), fácilmente va a la carpeta Spam (sí, sí con plugins como Mail Mail Bank se soluciona pero, prefiero usar functions.php), pero, el problema fuerte es este:

    Una vez llega una Notificación desde tu WP a cualquier email (hotmail, gmail), si alguien le da click donde dice: Ver origen del mensaje, obtiene algo así:

    Received: from hostname1234.yourhost .com
    Received: from your-hosting-username by hostname1234.yourhost .com
    X-AntiAbuse: Primary Hostname – hostname1234.yourhost .com
    X-Source-Args: /opt/php70/bin… /your full path disclosure / admin-ajax.php
    X-Source-Auth: your-hosting-username

    O sea, el username y tu acceso al CPanel quedan expuestos. Un hacker experto solo necesitaría dar con tu Password para destrozar tu(s) sitio(s) web.