API REST de WordPress: por qué bloquear solo las solicitudes sin sesión en lugar de desactivarla por completo

Aviso de afiliados v3.1
Aviso de afiliados v3.2 (móvil)

La API REST de WordPress muestra los nombres de usuario del sitio a través de la dirección wp-json, incluso a visitantes que no han iniciado sesión. Desactivarla por completo puede impedir que el editor de bloques guarde, así que aquí se explica cómo bloquear solo las solicitudes sin sesión iniciada y comprobarlo con una respuesta 401.

1️⃣ Qué es la API REST de WordPress: la dirección wp-json y su función

La API REST de WordPress es una función integrada de WordPress que intercambia datos del sitio, como entradas, páginas y usuarios, en formato JSON, y responde bajo /wp-json/ después de la dirección del sitio.

Bajo /wp-json/, las direcciones se dividen por tipo de dato, como [wp/v2/posts], [wp/v2/pages] y [wp/v2/users], y cada una de ellas se llama endpoint. El editor de bloques también envía solicitudes a estas direcciones al guardar una entrada.

https://example.com/wp-json/
https://example.com/wp-json/wp/v2/posts
https://example.com/wp-json/wp/v2/pages
https://example.com/wp-json/wp/v2/users

2️⃣ Nombres de usuario expuestos a través de wp-json

  • ↪️ Por qué bloquearlo: users 401 · también visible en las páginas de autor

El endpoint [wp/v2/users] devuelve el nombre visible y el slug de cada usuario que ha publicado entradas, y por defecto el slug contiene el nombre de usuario de acceso tal cual. En el sitio de prueba, https://testpilotweb.com/, el slug de la cuenta de administrador también coincidía con su nombre de usuario de acceso.

Si el nombre de usuario de acceso queda expuesto, al atacante solo le falta averiguar la contraseña para iniciar sesión, y la página de acceso de WordPress del sitio de prueba registró 2.570 intentos de fuerza bruta solo el 7 de octubre de 2026.

Aunque bloquees esta dirección, el mismo nombre de usuario sigue apareciendo en la dirección de la página de autor (/author/usuario/).

3️⃣ Lo que se rompe si la desactivas por completo

  • ↪️ Guardado en el editor de bloques · MCP con 0 herramientas

Desactivar por completo la WP REST API rompe primero el guardado en el editor de bloques, y por eso Perfmatters, uno de los plugins de optimización de WordPress, divide el alcance en dos niveles: [Disable for Non-Admins] y [Disable When Logged Out]. En sitios con cuentas de autor o colaborador, [Disable for Non-Admins] también impide que esas cuentas guarden entradas.

Incluso en un sitio que solo bloqueaba las solicitudes sin sesión, al conectar un conector MCP en claude.ai aparecieron 0 herramientas tras completar la autenticación. El registro del servidor mostraba todas las solicitudes MCP como 401, y la causa era que Perfmatters bloqueaba la solicitud antes de que MCP comprobara el token.

Valor de [Disable REST API]Dirección users para visitantes sin sesiónGuardado por cuentas no administradorasAdecuado para
Default (Enabled)Nombres de usuario expuestosSe guarda—
Disable for Non-Admins401Falla el guardadoSitios sin cuentas de autor o colaborador
Disable When Logged Out401Se guardaSitios con cuentas de autor; añade rutas de excepción para conexiones con token como MCP

4️⃣ Bloquear solo las solicitudes sin sesión (Perfmatters)

  • ↪️ Dónde configurarlo · comprobar la respuesta 401

En el escritorio de WordPress, ve a [Ajustes] → [Perfmatters] → [General], cambia [Disable REST API] en [Core] a [Disable When Logged Out] y pulsa [Save Changes].

WordPress Settings → Perfmatters → General(API REST de WordPress)
Perfmatters Disable REST API: Disable When Logged Out

Idiomas compatibles con Perfmatters: inglés (predeterminado), coreano, alemán, francés, italiano, neerlandés, portugués (Brasil), ruso, ucraniano, turco, búlgaro, húngaro, indonesio, persa, chino (simplificado)

Perfmatters settings simulator: General → Core
Simulador de ajustes de Perfmatters · Reseña y guía de Perfmatters

Si abres /wp-json/wp/v2/users en una ventana de incógnito sin iniciar sesión, devuelve una respuesta 401 con el mensaje [Sorry, you do not have permission to make REST API requests.], mientras que el editor de bloques sigue guardando entradas con la sesión iniciada.

🔌 Misma solicitud, dos respuestas GET /wp-json/wp/v2/users
Sitio sin bloqueo
200
Los visitantes sin sesión pueden ver los nombres de usuario.
[
  {
    "id": 1,
    "name": "User A",
    "slug": "user_a",
    "link": "https://example.com/author/user_a/"
  }
]
Sitio con [Disable When Logged Out]
401
Las solicitudes sin sesión reciben una respuesta 401 con un mensaje.
{
  "code": "rest_authentication_error",
  "message": "Sorry, you do not have permission to make REST API requests.",
  "data": { "status": 401 }
}
slug Por defecto, el slug contiene el nombre de usuario de acceso tal cual.
A la izquierda solo se muestran cuatro campos de la respuesta (id, name, slug y link), y el nombre es un ejemplo (user_a).


5️⃣ Añadir excepciones a las rutas bloqueadas

  • ↪️ Excepción de ruta MCP · diferencia con eliminar los enlaces de la API REST

Si necesitas abrir solo una ruta concreta mientras bloqueas, añade esa ruta al filtro [perfmatters_rest_api_exceptions] de Perfmatters. El problema de 0 herramientas del conector MCP de claude.ai se resolvió creando un fragmento PHP en el menú [Code] de Perfmatters y dejando como excepción solo la ruta MCP.

add_filter('perfmatters_rest_api_exceptions', function($exceptions) {
    $exceptions[] = '/mcp/mcp-oauth-server';
    return $exceptions;
});

Incluso después de añadir la excepción, el propio MCP bloquea las solicitudes sin token con una respuesta 401 y el mensaje [MCP authentication required.], mientras que /wp-json/wp/v2/users sigue devolviendo la respuesta 401 de Perfmatters.

🚦 El orden que sigue una solicitud
Antes de la excepción · solicitud MCP
Solicitud enviada por el conector MCP de claude.ai tras la autenticación, con [Disable When Logged Out] activado.
Perfmatters
Bloqueada con 401
→↓
Comprobación del token MCP
No se alcanza
→↓
Resultado
0 herramientas
Después de la excepción · solicitud MCP
/mcp/mcp-oauth-server : ruta añadida a las excepciones de Perfmatters.
Perfmatters
Pasa por ser ruta de excepción
→↓
Comprobación del token MCP
Lo comprueba el propio MCP
→↓
Resultado
401 si no hay token
[MCP authentication required.]
Después de la excepción · /wp-json/wp/v2/users
Las rutas que no están en las excepciones siguen bloqueadas.
Perfmatters
Bloqueada con 401
→↓
Resultado
Los nombres de usuario siguen ocultos
⚠️ Perfmatters bloquea la solicitud antes de que MCP compruebe el token.

[Remove REST API Links], en la misma sección [Core], solo elimina el enlace api.w.org de la cabecera de la página y de las cabeceras de respuesta; la WP REST API en sí sigue respondiendo.

🔢 FAQ & contenido recomendado

xmlrpc.php es una dirección distinta de la API REST, así que sigue respondiendo aunque la API REST esté bloqueada. El sitio de prueba registró 734 solicitudes POST a xmlrpc.php solo el 8 de octubre de 2026, y Perfmatters puede bloquearlo con [Disable XML-RPC] en la misma sección [Core].

WP Rocket mantiene las direcciones /wp-json/ en su lista de exclusión de caché, así que las respuestas de la API REST cambian en cuanto guardas. Los ajustes que cambian el HTML de la página, como [Remove REST API Links], se aplican después de vaciar la caché.

No. El editor de bloques de WordPress envía solicitudes a la API REST al guardar entradas, y los conectores MCP que enlazan herramientas de IA como claude.ai también usan rutas bajo /wp-json/.

ℹ️ Aviso de afiliados
El contenido de este sitio incluye enlaces de afiliado. Cuando un visitante compra un producto o servicio a través de uno de ellos, el sitio recibe una comisión del vendedor. El importe que paga el comprador(baja durante las promociones ↓)no aumenta. Los precios, descuentos y existencias publicados corresponden al momento de redacción y pueden variar, así que confírmalos con el vendedor antes de comprar. Los productos se eligen y evalúan con criterios propios, y las comisiones no influyen en el orden ni en el contenido de las reseñas.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Demuestra que eres humano: 10   +   9   =