La REST API de WordPress es una interfaz integrada que permite a aplicaciones externas, frontends basados en JavaScript, aplicaciones móviles y servicios de terceros comunicarse con tu sitio WordPress mediante peticiones HTTP estándar y datos JSON. Se incorporó al núcleo de WordPress en la versión 4.7 (diciembre de 2016) y desde entonces se ha convertido en la columna vertebral del desarrollo moderno con WordPress, impulsando desde el editor de bloques Gutenberg hasta arquitecturas headless de WordPress.
Antes de que existiera la REST API, la única forma programática de interactuar con WordPress desde el exterior era a través de XML-RPC, un protocolo más antiguo y mucho más limitado. La REST API sustituyó ese enfoque por algo bastante más flexible, pero también introdujo nuevas consideraciones de seguridad que todo propietario de un sitio WordPress debería conocer.
Endpoints por defecto y qué exponen
La REST API vive en /wp-json/wp/v2/ en cada instalación de WordPress. Por defecto, expone una amplia gama de endpoints:
/wp-json/wp/v2/posts: devuelve todas las entradas publicadas con su contenido completo, IDs de autor, categorías, etiquetas y referencias a la imagen destacada./wp-json/wp/v2/pages: igual que posts pero para páginas estáticas./wp-json/wp/v2/users: lista todos los usuarios que han publicado al menos una entrada. Es el endpoint por defecto más sensible desde el punto de vista de seguridad./wp-json/wp/v2/categoriesy/wp-json/wp/v2/tags: devuelven los términos de taxonomía con descripciones y recuentos de entradas./wp-json/wp/v2/comments: lista los comentarios públicos, incluidos los nombres de los comentaristas y, a veces, sus direcciones de correo electrónico si el sitio está mal configurado./wp-json/wp/v2/media: lista los archivos multimedia subidos con sus URLs, dimensiones y metadatos./wp-json/wp/v2/search: proporciona un endpoint de búsqueda que refleja la búsqueda integrada del sitio./wp-json/(la raíz): devuelve un índice completo de todos los namespaces y rutas de API registrados, revelando en la práctica cada plugin que registra sus propios endpoints de API.
Los plugins añaden con frecuencia sus propios namespaces. WooCommerce añade /wp-json/wc/v3/, Yoast SEO añade endpoints bajo su namespace, y los plugins de formularios de contacto pueden exponer endpoints de envío. El índice raíz de la API revela todos estos, dando a un atacante una imagen clara de qué plugins están instalados.
El riesgo de enumeración de usuarios
El endpoint /wp-json/wp/v2/users es el problema de seguridad más comentado de la REST API. Por defecto, cualquiera puede visitar este endpoint y obtener una respuesta JSON que lista a todos los usuarios que han creado contenido. Cada entrada de usuario incluye su nombre de usuario (el campo slug), nombre mostrado, ID de usuario, URL del avatar y un enlace a su archivo de autor.
¿Por qué importa esto? Porque los nombres de usuario son la mitad de la ecuación de inicio de sesión. Si un atacante sabe que tu cuenta de administrador usa el nombre sara_admin, solo necesita adivinar (o probar por fuerza bruta) la contraseña. Sin la REST API, encontrar nombres de usuario requería más esfuerzo, como adivinar URLs de archivo de autor del tipo /?author=1. La REST API entrega esta información libremente en un formato estructurado y legible por máquina.
No es una preocupación teórica. Bots automatizados rastrean rutinariamente /wp-json/wp/v2/users en sitios WordPress para construir listas de objetivos para credential stuffing y ataques de fuerza bruta. Si tu sitio tiene un usuario llamado admin, esa cuenta será la primera en ser atacada.
Métodos de autenticación para la REST API
Las peticiones no autenticadas a la REST API solo devuelven datos disponibles públicamente (entradas publicadas, perfiles de usuario públicos, etc.). Para crear, actualizar o eliminar contenido a través de la API, necesitas autenticación. WordPress admite varios métodos:
- Autenticación por cookie: es lo que usa el editor Gutenberg. Cuando tienes la sesión iniciada en WordPress, tu navegador envía cookies de sesión con cada petición a la API. Un valor nonce previene la falsificación de petición entre sitios. Este método solo funciona dentro del contexto del navegador.
- Application Passwords: introducidas en WordPress 5.6, esta funcionalidad te permite generar contraseñas únicas para cada aplicación que necesite acceso a la API. Cada application password está vinculada a una cuenta de usuario concreta. Puedes revocarlas individualmente sin cambiar tu contraseña principal. Se envían vía HTTP Basic Auth y solo funcionan sobre HTTPS.
- JWT (JSON Web Tokens): no está integrado en el núcleo de WordPress, pero está disponible mediante plugins como "JWT Authentication for WP REST API". JWT es popular en configuraciones de WordPress headless donde una aplicación frontend necesita autenticar usuarios y hacer llamadas a la API en su nombre.
- OAuth: también disponible mediante plugins. OAuth es el método preferido cuando aplicaciones de terceros necesitan acceder a la API de tu sitio en nombre de tus usuarios, porque evita compartir contraseñas directamente.
Cuándo necesitas realmente la REST API
La REST API no es una característica opcional que puedas desactivar a la ligera. Está profundamente integrada en el núcleo de WordPress y muchos plugins dependen de ella:
- Editor de bloques Gutenberg: toda la experiencia de edición depende de la REST API. Cada vez que creas, guardas o previsualizas una entrada en el editor de bloques, este se comunica con la REST API. Desactivarla te obligaría a volver al Editor Clásico.
- WordPress headless: si usas WordPress como backend de gestión de contenidos con un frontend separado construido en React, Vue, Next.js o Nuxt, la REST API (o su contraparte más reciente, WPGraphQL) es la forma en que el frontend recupera contenido.
- Aplicaciones móviles: la app móvil oficial de WordPress se comunica con tu sitio a través de la REST API. Muchas aplicaciones personalizadas para sitios de membresía, plataformas de aprendizaje o medios de noticias también la usan.
- Funcionalidad de plugins: muchos plugins modernos dependen de la REST API para sus interfaces de administración. Los plugins que usan React o Vue para sus páginas de ajustes hacen llamadas a la API en segundo plano. WooCommerce, Jetpack, Yoast SEO y docenas más se romperían sin ella.
- Integraciones de terceros: Zapier, IFTTT y herramientas de automatización similares pueden interactuar con tu sitio WordPress a través de la REST API, permitiendo flujos como crear automáticamente entradas a partir de envíos de formularios o sincronizar contenido entre plataformas.
Hardening de seguridad sin romper nada
El enfoque correcto no es deshabilitar la REST API por completo, sino restringir las partes que exponen información sensible. Estos son pasos prácticos:
- Restringe el endpoint de usuarios: requiere autenticación para
/wp/v2/users. Varios plugins de seguridad ofrecen esto con un único interruptor. También puedes añadir un fragmento de código alfunctions.phpde tu tema o a un plugin personalizado que se enganche enrest_authentication_errorspara bloquear el acceso no autenticado a endpoints concretos. - Elimina el enlace a la REST API del HTML: WordPress emite una etiqueta
<link rel="https://api.w.org/">en el head del HTML, anunciando la URL de la API. Eliminar esta etiqueta no desactiva la API, pero deja de anunciar su ubicación a los escáneres automatizados. - Deshabilita XML-RPC también: si estás asegurando la REST API, deshabilita también la antigua interfaz XML-RPC (
/xmlrpc.php), que tiene su propio conjunto de vulnerabilidades de fuerza bruta y DDoS. - Usa un plugin de cortafuegos: plugins como Wordfence, Sucuri o iThemes Security pueden limitar el acceso a la API por dirección IP, bloquear bots maliciosos conocidos y añadir limitación de tasa para prevenir el abuso automatizado.
- Elimina endpoints de plugins no usados: si un plugin registra rutas de API que no necesitas, puedes usar el filtro
rest_endpointspara eliminarlas. Esto reduce tu superficie de ataque y también previene la fuga de información sobre qué plugins tienes instalados.
Qué comprueba InspectWP
InspectWP comprueba si la REST API es accesible públicamente buscando la etiqueta <link rel="https://api.w.org/"> en el HTML de tu sitio. También comprueba si el endpoint /wp-json/wp/v2/users devuelve datos de usuarios sin autenticación, lo que indicaría un riesgo de enumeración de usuarios. Si la etiqueta de enlace de la API está presente, InspectWP reporta la URL de la REST API descubierta. Si se exponen datos de usuario, se marca como un problema de seguridad con la recomendación de restringir ese endpoint solo a peticiones autenticadas.