¿Cómo limito los intentos de login (inicio de sesión) en WordPress?
Por Eureka Studio · Actualizado
Respuesta corta
WordPress deja que cualquiera adivine contraseñas sin fin. Para limitar los intentos de login, usa un plugin que cuente los accesos fallidos por IP dentro de un intervalo de tiempo y bloquee esa IP durante un rato; por ejemplo, 8 fallos en 5 minutos suponen 15 minutos de espera. Asegúrate de que los fallos de 2FA y de contraseñas de aplicación también cuentan, y añade tu propia IP a la lista de permitidas.
Pasos
1Paso 1
Mira cómo es adivinar sin límite
Sin límite, WordPress responde a cada contraseña incorrecta con el mismo error, tantas veces como se lo pidan, y el mensaje predeterminado incluso confirma que el nombre de usuario existe.

2Paso 2
Activa los Límites de acceso y fija las reglas
En WordPress, abre Hushfort → Límites y restricciones y activa «Activar los límites de acceso». Por defecto son 8 intentos fallidos en 5 minutos y, después, un bloqueo de 15 minutos; tras 4 bloqueos en 24 horas, el bloqueo dura 1.440 minutos. Pulsa Guardar cambios.

3Paso 3
Añade tu IP a la lista de permitidas y revisa el origen de la IP
Más abajo, ajusta el Origen de la IP. «Automático (solo cabeceras de proxy verificadas)» encaja con la mayoría de los sitios, incluidos los que están detrás de Cloudflare. Después, añade la IP de tu oficina o de tu casa en IP permitidas para que nunca puedas quedarte fuera, y guarda.

4Paso 4
Recibe un correo cuando se bloquee una IP
Activa el Correo de alerta e indica una o varias direcciones, separadas por comas. El interruptor necesita que el sitio tenga SMTP funcionando; si no lo tiene, Hushfort mantiene la opción desactivada y te explica por qué.

5Paso 5
Mira cómo funciona el límite
Tras el número de fallos permitido, la IP queda bloqueada en lugar de recibir otro intento. El Historial lista cada bloqueo activo con el nombre de usuario que probó, el número de intentos y cuándo termina el bloqueo, con un botón Desbloquear.
Por qué importa
Un ataque de fuerza bruta no es más que paciencia: probar una contraseña, fallar, probar la siguiente. A WordPress le da igual. Responderá a mil intentos fallidos desde la misma dirección con la misma cortesía que al primero. Si una cuenta tiene una contraseña débil o reutilizada, es solo cuestión de tiempo.
Un límite de accesos cambia las cuentas. Si una IP solo puede hacer unos pocos intentos antes de tener que esperar quince minutos, adivinar una contraseña decente lleva años en lugar de horas. Además, evita que tu servidor genere una y otra vez la página de acceso para un bot.
Lo que no cubre por sí solo. Los atacantes que controlan miles de direcciones IP pueden enviar unos pocos intentos desde cada una. Por eso un límite de accesos funciona mejor junto a la autenticación de dos factores, que hace inútil una contraseña adivinada si no se tiene el código.
Errores habituales
- Contar solo el formulario de acceso. También se pueden probar contraseñas a través de
xmlrpc.php, de las contraseñas de aplicación de la API REST y en el paso del código de dos factores. Si eso no cuenta para el límite, los atacantes simplemente lo usan. Cierra también el acceso por XML-RPC; consulta cómo desactivar XML-RPC de forma segura. - Leer la IP equivocada detrás de un proxy. Si tu sitio está detrás de Cloudflare y el
plugin lee la dirección del proxy, un solo bot puede bloquear a todos los visitantes. Si, en
cambio, confía a ciegas en la cabecera
X-Forwarded-For, un bot puede inventarse una IP nueva en cada petición y no ser contado nunca. La regla segura es confiar en las cabeceras del proxy solo cuando la petición viene de verdad del proxy. - Bloqueos demasiado largos. Un bloqueo de 24 horas por tres erratas castiga a tu propio equipo. Mantén corto el primer bloqueo y alarga los bloqueos repetidos.
- Sin lista de permitidas. Añade tu propia IP fija para que una contraseña olvidada no te deje nunca fuera.
Sin plugin
WordPress tiene un hook, wp_login_failed, que se dispara tras cada acceso fallido. Puedes
contar los fallos con un transient y rechazar los accesos cuando la cuenta sea demasiado alta.
Una versión mínima para un plugin de uso obligatorio (wp-content/mu-plugins/login-limit.php):
<?php
add_action( 'wp_login_failed', function () {
$key = 'll_' . md5( $_SERVER['REMOTE_ADDR'] );
$n = (int) get_transient( $key );
set_transient( $key, $n + 1, 15 * MINUTE_IN_SECONDS );
} );
add_filter( 'authenticate', function ( $user ) {
$key = 'll_' . md5( $_SERVER['REMOTE_ADDR'] );
if ( (int) get_transient( $key ) >= 8 ) {
return new WP_Error( 'too_many', 'Too many failed attempts. Try again later.' );
}
return $user;
}, 30 );
Funciona, pero sé honesto sobre lo que se le escapa: solo lee REMOTE_ADDR, así que detrás de
un proxy cuenta el proxy; no cuenta como intentos separados las contraseñas probadas con
multicall de XML-RPC; y no tiene lista de permitidas, ni correo de alerta, ni registro. Cada una
de esas cosas es más código que escribir y mantener.
Algunos hostings también ofrecen herramientas a nivel de servidor, como fail2ban vigilando el registro de accesos. Es sólido si tu hosting lo gestiona por ti; en un hosting compartido normalmente no puedes configurarlo.
Si algo sale mal
- Te has bloqueado a ti mismo. Espera a que termine el bloqueo, prueba desde otra red, como los datos móviles, o pide a otro administrador que añada tu IP a la lista de permitidas.
- Todo el mundo queda bloqueado a la vez. Seguramente tu sitio está detrás de un proxy y el plugin está leyendo la IP del proxy. Cambia el ajuste del origen de la IP.
- Nunca se produce ningún bloqueo. Comprueba si el origen de la IP confía en una cabecera que los bots pueden falsificar. Si cada intento muestra una «IP» distinta, esa es la causa.
Para conocer todas las formas de volver a entrar, consulta Sin acceso después de cambiar la URL de acceso.
Con Hushfort
Los Límites de acceso forman parte de Hushfort Pro, el complemento de pago que se instala sobre Hushfort Security, el plugin de seguridad gratuito para WordPress.
La capa de Límites de acceso de Hushfort cuenta los accesos fallidos por IP (o por IP y nombre de usuario) dentro de un intervalo de tiempo que tú eliges, y bloquea la IP durante el tiempo que tú decidas. Los bloqueos repetidos en 24 horas pueden activar un bloqueo prolongado, más largo.
- Los códigos de dos factores fallidos y los accesos fallidos con contraseñas de aplicación también cuentan, así que no queda ninguna puerta lateral para adivinar.
- Solo se confía en las cabeceras del proxy cuando la petición viene de verdad de Cloudflare o de una red privada.
- Los correos de alerta llegan a tantas direcciones como indiques.
- Cada intento fallido y bloqueado aparece en un Historial filtrable.
- La lista de permitidas se comparte con todas las demás capas de Hushfort, así que te añades una sola vez.
Al desactivar Hushfort se levantan todos los bloqueos existentes.
Preguntas frecuentes
¿Cuántos intentos de acceso debería permitir?
¿WordPress limita los intentos de acceso por defecto?
¿Un límite de accesos puede dejarme fuera de mi propio sitio?
¿Limitar los intentos de acceso basta para detener la fuerza bruta?
¿Por qué los bloqueos afectan a quien no deben detrás de Cloudflare?
Guías relacionadas
¿Cómo activo la autenticación de dos factores (2FA) en WordPress?
Activa la 2FA en WordPress con cualquier app de autenticación, guarda los códigos de recuperación y aprende qué hacer si pierdes el móvil.
Ver los pasos¿Qué es xmlrpc.php y cómo lo desactivo en WordPress?
xmlrpc.php es una segunda puerta de acceso a WordPress que ocultar el login no cierra. Cómo desactivarlo bien, mantener los pingbacks y comprobarlo.
Ver los pasos¿Cómo cambio la URL de login (acceso) de WordPress y oculto wp-admin?
Cambia la URL de login de WordPress y oculta wp-admin en cinco pasos seguros. Prueba la nueva URL antes de cerrar sesión y aprende a volver a entrar.
Ver los pasos
