UA-51298262-10 Skip to main content
WordPress

Limitar intentos de inicio de sesión en WordPress sin plugins

By octubre 9, 2026No Comments
Limitar intentos de inicio de sesión en WordPress sin plugins

Limitar los intentos de inicio de sesión en WordPress es quizá la medida de seguridad con mejor relación entre esfuerzo y resultado que existe. Y sin embargo, casi nadie la aplica. WordPress, por defecto, permite infinitos intentos: un atacante puede probar millones de combinaciones de usuario y contraseña hasta dar con la correcta. Aquí verás cómo cerrar esa puerta usando solo código propio, sin instalar ni un plugin más, lo que de paso reduce la superficie de ataque y el consumo de recursos de tu servidor.

Por qué limitar los intentos de inicio de sesión en WordPress

Los ataques de fuerza bruta contra wp-login.php siguen siendo uno de los vectores más habituales. Los bots rastrean millones de sitios automáticamente y lanzan diccionarios de contraseñas robadas en filtraciones anteriores. Si no pones límite, cada solicitud dispara una consulta a la base de datos y carga WordPress entero. ¿Y eso qué implica? Esto:

  • Saturar tu servidor: cientos de peticiones por minuto al formulario de login se comen la CPU y la memoria. Tu web se ralentiza para los visitantes de verdad.
  • Comprometer credenciales: con tiempo suficiente, un ataque de diccionario acaba encontrando contraseñas débiles o reutilizadas. Siempre las encuentra, tarde o temprano.
  • Inyectar contenido malicioso: una vez dentro, el atacante puede instalar puertas traseras, redirigir tráfico o meter tu dominio en listas negras de Google.

Con un límite de, digamos, 5 intentos fallidos antes de bloquear la IP durante 30 minutos, el ataque deja de ser viable. Un bot que necesitaría años para recorrer un diccionario pequeño acaba descartando tu sitio como objetivo. No es magia. Es aritmética.

Riesgos de depender de plugins para la protección del login

Los plugins limitadores son útiles, sí. Pero traen sus propios riesgos, y muchos administradores no los ven:

  • Superficie de ataque adicional: cada plugin es código de terceros con posibles fallos propios. Un plugin de seguridad desactualizado puede convertirse, irónicamente, en la puerta de entrada que decía cerrar.
  • Impacto en rendimiento: suelen registrar cada intento en la base de datos, hinchando tablas como wp_options y otras relacionadas, con el consiguiente peaje en las consultas.
  • Dependencia y abandono: si el desarrollador lo deja, quedas expuesto sin saberlo. Es un patrón tristemente común en el repositorio oficial.
  • Conflictos: dos plugins de seguridad pueden chocar entre sí o con la caché, generando bloqueos falsos para usuarios legítimos.

Con código propio mandas tú. Menos dependencias, menos actualizaciones que vigilar y un comportamiento predecible al cien por cien.

Cómo limitar intentos de inicio de sesión WordPress con código personalizado

La estrategia es sencilla: usar el hook wp_login_failed para registrar los intentos fallidos por IP (con transitorios que caducan) y el filtro authenticate para rechazar conexiones cuando se supere el límite. Añade este código al functions.php de tu tema hijo o, mejor aún, a un plugin de funcionalidades propio:

  1. Define los parámetros: máximo de 5 intentos fallidos y bloqueo de 1800 segundos (30 minutos). Puedes ajustar estos valores según tu tráfico.
  2. Registra el fallo: en el hook wp_login_failed, obtén la IP del visitante con $_SERVER[‘REMOTE_ADDR’], incrementa un transitorio asociado a esa IP y fija su caducidad al periodo de bloqueo.
  3. Bloquea el acceso: enganchado a authenticate con prioridad 30 (después de la autenticación de WordPress), comprueba si el transitorio de esa IP alcanzó el límite. Si es así, devuelve un objeto WP_Error con el mensaje «Demasiados intentos fallidos. Inténtalo de nuevo en 30 minutos».
  4. Limpia al iniciar sesión: en el hook wp_login, elimina el transitorio de la IP para que un acceso correcto reinicie el contador.

Consejo práctico: ¿tu sitio va detrás de un proxy o CDN como Cloudflare? Entonces usa la cabecera HTTP_CF_CONNECTING_IP (o HTTP_X_FORWARDED_FOR) en lugar de REMOTE_ADDR. De lo contrario, todas las peticiones compartirán la IP del proxy y bloquearías a usuarios legítimos de forma masiva.

En la siguiente parte de esta guía publicaremos el código completo listo para copiar y pegar, con explicación línea por línea y variantes para entornos con caché de servidor.

Bloqueo por IP y protección del login con .htaccess

Si tu hosting corre sobre Apache (lo habitual en servidores compartidos y VPS con LAMP), el archivo .htaccess es tu primera línea de defensa, y funciona con o sin WordPress. Puedes combinarlo con el límite de intentos por código y tener así protección en capas.

Bloquear el acceso a wp-login.php por IP

¿Solo tú o un equipo reducido gestionáis el sitio? Entonces la medida más efectiva es de las simples: restringir el acceso directo al formulario de login.

  1. Entra por FTP o mediante el gestor de archivos del hosting y busca el .htaccess en la raíz de WordPress.
  2. Añade este bloque al final:
FilesMatch «wp-login.php»:
Order Deny,Allow
Deny from all
Allow from 85.123.45.67
Allow from 85.123.45.68

Sustituye las IP por las de tu oficina o domicilio. Ojo con un detalle: si tu IP es dinámica, tendrás que actualizar el archivo cada vez que cambie (o pedir a tu operador una fija). ¿Gestionas desde varias ubicaciones? Pues una línea Allow por cada una.

Proteger wp-config.php y el directorio wp-includes

Ya que estás dentro, aprovecha para blindar otros archivos sensibles:

  • wp-config.php: bloquea el acceso externo con FilesMatch «wp-config.php» seguido de Order allow,deny y Deny from all.
  • xmlrpc.php: si no usas la API XML-RPC (la mayoría de sitios no la necesita), deniégalo también. Es otro vector clásico de fuerza bruta.
  • wp-includes: añade Options -Indexes para evitar listados de directorios.

Y antes de tocar nada, descarga una copia del .htaccess original. Siempre. Un error de sintaxis deja el sitio caído con un error 500, y con la copia lo restauras en segundos.

Otras medidas complementarias: cambiar la URL de login y usar claves seguras

Limitar intentos reduce el riesgo, sí. Pero combinado con otras prácticas, la protección se multiplica. Y sin instalar un solo plugin.

Cambiar la URL de acceso

wp-login.php es el objetivo predeterminado de todos los bots. Muévelo y eliminas el 90% del ruido automatizado. Sin plugins se hace con un par de reglas de reescritura en .htaccess:

  • Define una URL personalizada (por ejemplo /acceso-seguro) con RewriteRule que redirija internamente a wp-login.php.
  • Bloquea después el acceso directo a wp-login.php devolviendo un 404.
  • Aplica el mismo principio con la constante DISALLOW_FILE_EDIT en wp-config.php para desactivar el editor de archivos del panel.

Eso sí: la técnica exige configuración cuidada. Si te lias con las reglas de reescritura, en RedServicio (redservicio.net) podemos configurarla por ti de forma segura.

Contraseñas y usuarios robustos

Ningún sistema de límites compensa unas credenciales débiles. Ninguno.

  • Usa contraseñas de al menos 16 caracteres, generadas con gestores como Bitwarden o KeePassXC.
  • Evita el usuario «admin»: si existe, crea uno nuevo con rol de administrador, transfiere el contenido y elimina el antiguo.
  • Activa la autenticación en dos pasos a nivel de servidor si tu hosting lo ofrece, o protege wp-login.php con una autenticación básica HTTP adicional (AuthUserFile en .htaccess).

Esta doble autenticación básica es especialmente disuasoria, por cierto. Los bots abandonan antes siquiera de llegar a WordPress.

Conclusión: protege tu WordPress sin instalar nada adicional

Como has visto a lo largo de esta guía, limitar los intentos de inicio de sesión en WordPress es perfectamente viable sin plugins: unas líneas de código en functions.php o en un must-use plugin para registrar los fallos, un mecanismo de bloqueo temporal por IP y, si quieres una capa extra, reglas en .htaccess para restringir el acceso por ubicación. Las ventajas son claras: menos superficie de ataque, mejor rendimiento (cargas menos código de terceros) y control total sobre cada regla que aplicas.

Ahora bien, la seguridad es un conjunto de capas, no una acción única. Combina el límite de intentos con credenciales fuertes, una URL de login personalizada, WordPress y plugins actualizados, y copias de seguridad automáticas. Y si prefieres no tocar código, o has aplicado algún cambio y el acceso se ha bloqueado (pasa más de lo que crees), en RedServicio (redservicio.net) encontrarás ayuda profesional para aplicar estas configuraciones sin riesgos y recuperar el control de tu sitio en minutos.