Cómo implementar un honeypot contra bots de login en tu servidor de MU Online
Aprende a montar un sistema honeypot en el ConnectServer y en el sitio de registro de tu servidor de MU Online para identificar y bloquear bots de creación de cuentas y fuerza bruta de login sin afectar a los jugadores reales.
Los bots de creación masiva de cuentas y los scripts de fuerza bruta de login son un dolor de cabeza constante para los administradores de servidores privados de MU Online: inflan cifras falsas de registro, intentan adivinar contraseñas de cuentas valiosas y, en servidores con sistema de recompensa
Los bots de creación masiva de cuentas y los scripts de fuerza bruta de login son un dolor de cabeza constante para los administradores de servidores privados de MU Online: inflan cifras falsas de registro, intentan adivinar contraseñas de cuentas valiosas y, en servidores con sistema de recompensa por primer login, explotan ese tipo de beneficio a escala. Un honeypot es una trampa discreta — un campo, endpoint o comportamiento con el que solo un script automatizado interactuaría, nunca un humano real — que permite identificar y bloquear esos bots sin perjudicar la experiencia de los jugadores legítimos. Este tutorial detalla cómo implementar honeypots tanto en el sitio de registro como en el ConnectServer de tu emulador, con ejemplos prácticos de código y configuración.
Qué es un honeypot y por qué funciona
La lógica del honeypot es simple: creas un "cebo" que está técnicamente presente en la página o en el protocolo, pero invisible o irrelevante para un usuario humano normal. Los bots que analizan el HTML/DOM de forma automatizada, o que envían paquetes de red de forma genérica sin reproducir el comportamiento exacto de un cliente real, terminan interactuando con ese cebo — llenando un campo que deberían ignorar, o accediendo a un endpoint al que ningún humano accedería directamente. A diferencia de un CAPTCHA, el honeypot no exige ninguna acción extra del usuario real, lo que lo hace prácticamente invisible a la experiencia legítima.
Honeypot en el formulario de registro del sitio
La implementación más simple y ampliamente usada en cualquier sitio con formulario es el campo invisible. Agrega un campo de entrada al formulario de registro, oculto vía CSS (nunca vía type="hidden", que algunos bots ya ignoran por defecto), y rechaza cualquier envío en el que ese campo venga lleno.
<style>
.hp-field { position: absolute; left: -9999px; top: -9999px; }
</style>
<form method="POST" action="/registro">
<input type="text" name="usuario" placeholder="Usuario">
<input type="password" name="clave" placeholder="Contraseña">
<input type="email" name="email" placeholder="Correo">
<!-- Campo honeypot: invisible para humanos, visible para bots que leen el DOM -->
<input type="text" name="website" class="hp-field" tabindex="-1" autocomplete="off">
<button type="submit">Crear cuenta</button>
</form>
<?php
if (!empty($_POST['website'])) {
// Campo honeypot lleno = bot. Rechaza en silencio.
http_response_code(200); // finge éxito para no alertar al bot
exit;
}
// continúa el flujo normal de registro para envíos legítimos
Nota el detalle de responder con éxito falso (200) en vez de un error explícito — esto evita que el operador del bot ajuste el script al percibir un rechazo inmediato, manteniendo la trampa eficaz por más tiempo.
Honeypot de tiempo de llenado
Complementando el campo invisible, mide el tiempo entre la carga del formulario y su envío. Los bots frecuentemente envían formularios en menos de 1-2 segundos, un tiempo imposible para que un humano lea los campos y escriba usuario, contraseña y correo.
<?php
session_start();
if (!isset($_SESSION['form_loaded_at'])) {
$_SESSION['form_loaded_at'] = time();
}
// En el procesamiento del POST:
$tempo_decorrido = time() - $_SESSION['form_loaded_at'];
if ($tempo_decorrido < 3) {
// Envío demasiado rápido para ser humano
http_response_code(200);
exit;
}
Honeypot en el ConnectServer (nivel de protocolo)
Para bots que atacan directamente el ConnectServer (fuerza bruta de login, creación de cuenta vía protocolo sin pasar por el sitio), la estrategia consiste en monitorear patrones de paquetes que un cliente oficial nunca produciría: secuencia de paquetes fuera de orden, ausencia del handshake de versión esperado, o volumen de intentos de login desde la misma IP en un intervalo imposible para escritura humana. La mayoría de los emuladores (IGCN, MuEMU) ya exponen un log de intentos de login en tabla propia; la consulta de abajo identifica patrones sospechosos.
SELECT IP, COUNT(*) AS tentativas, MIN(LoginTime) AS primeira, MAX(LoginTime) AS ultima
FROM LoginAttemptLog
WHERE LoginTime > DATEADD(minute, -10, GETDATE())
GROUP BY IP
HAVING COUNT(*) > 15
ORDER BY tentativas DESC;
IPs con decenas de intentos en pocos minutos, especialmente contra usuarios secuenciales o inexistentes, indican fuerza bruta o escaneo automatizado, y pueden agregarse a una lista negra temporal en el firewall o en el propio ConnectServer.
Tabla de tipos de honeypot y dónde aplicarlos
| Tipo de honeypot | Dónde aplicar | Qué detecta |
|---|---|---|
| Campo invisible en el formulario | Sitio de registro/login | Bots que llenan todos los campos del DOM |
| Tiempo mínimo de llenado | Sitio de registro | Scripts que envían casi instantáneamente |
| Endpoint cebo (ruta falsa) | Sitio (ej.: /admin-login-legacy) | Escáneres automatizados de vulnerabilidades |
| Cuenta cebo monitoreada | Base de datos del servidor | Login exitoso con credencial nunca divulgada |
| Análisis de patrón de paquetes | ConnectServer | Clientes no oficiales o scripts de fuerza bruta |
Endpoint cebo en el sitio (ruta falsa)
Además del formulario, crea una ruta que nunca esté enlazada en ningún lugar visible del sitio (por ejemplo /wp-login.php o /admin-old), pero que los escáneres automatizados intentan acceder por defecto al rastrear cualquier dominio. Cualquier acceso a esa ruta es, por definición, automatizado — ningún humano navegando normalmente llegaría ahí. Registra la IP de acceso y agrégala a una lista de bloqueo automática.
Cuenta cebo monitoreada en la base de datos
Una técnica más avanzada es crear una cuenta "cebo" con credenciales nunca divulgadas públicamente y nunca usadas por el equipo, pero presente en la base de datos como cualquier cuenta real. Si esa cuenta específica sufre un intento de login, es evidencia fuerte de que alguien está probando credenciales obtenidas de una filtración de otro servicio (reutilización de contraseña) o de un volcado anterior del propio servidor — una alerta valiosa para revisar la seguridad general de la base de datos.
Respuesta gradual: soft-block antes del ban definitivo
Para minimizar el riesgo de que un falso positivo perjudique a un jugador real, aplica respuestas en capas crecientes de severidad en vez de banear ante la primera detección:
| Nivel | Disparador | Acción |
|---|---|---|
| 1 - Sospecha leve | Un honeypot activado aisladamente | Exigir CAPTCHA adicional en el siguiente intento |
| 2 - Sospecha moderada | Dos o más honeypots de la misma IP | Retraso artificial de respuesta (2-5 segundos) |
| 3 - Sospecha alta | Patrón consistente en múltiples intentos | Bloqueo temporal de IP (1-24h) |
| 4 - Confirmado | Evidencia cruzada (honeypot + volumen + cuenta cebo) | Bloqueo permanente y registro para auditoría |
Integrando el honeypot al panel de administración
Centraliza las alertas de honeypot (formulario, endpoint cebo, cuenta cebo, protocolo) en un único panel o canal de notificación (webhook al Discord del staff, por ejemplo), para que el equipo de seguridad vea el panorama completo en vez de logs dispersos. Un webhook simple puede disparar un mensaje cada vez que se active un honeypot, incluyendo IP, timestamp y tipo de trampa activada, permitiendo una respuesta manual rápida en casos ambiguos que la automatización no debería resolver sola.
Errores comunes y soluciones
| Síntoma | Causa probable | Solución |
|---|---|---|
| Campo honeypot visible para humanos por accidente | CSS aplicado incorrectamente o eliminado en una actualización del tema | Usa una clase CSS dedicada y prueba visualmente tras cualquier cambio de layout |
| Jugador real bloqueado por error | Ban automático en el primer disparo, sin gradación | Implementa respuesta en capas (soft-block antes del ban) |
| El bot evade el honeypot rápidamente | Rechazo explícito (error visible) alertó al operador del bot | Responde con éxito falso (200) en vez de error |
| Muchos falsos positivos de IP compartida | Bloqueo de IP sin considerar CGNAT/cibercafé | Combina con otras señales antes de bloquear la IP entera |
| Ninguna alerta llega a tiempo al equipo | Logs sin centralización ni notificación | Configura un webhook de alerta para el canal del staff |
| La cuenta cebo nunca es accedida | Las credenciales del cebo se filtraron solo a pocos, sin exposición real | Garantiza que la cuenta cebo figure en la base de datos como cualquier otra, sin trato especial visible |
Lista de verificación de implementación del honeypot
- Campo invisible agregado al formulario de registro y login.
- Verificación de tiempo mínimo de llenado implementada.
- Endpoint cebo creado y sin ningún enlace visible en el sitio.
- Cuenta cebo monitoreada registrada en la base de datos.
- Consulta de patrón de intentos de login programada en el ConnectServer.
- Respuesta gradual (soft-block antes del ban) configurada.
- Alertas centralizadas en un panel o webhook para el equipo de seguridad.
- Ningún detalle técnico de la implementación divulgado públicamente.
Con el honeypot activo, reduces significativamente el ruido de bots en el registro y el login sin sacrificar la experiencia de los jugadores reales; para cerrar el ciclo de seguridad de tu infraestructura, revisa también el tutorial de creación de servidor de MU Online y confirma que las demás capas de protección (firewall, anti-DDoS) están alineadas con esta estrategia.
Preguntas frecuentes
¿Un honeypot reemplaza al captcha en el registro?
No, se complementan. El captcha bloquea a parte de los bots antes de la envío del formulario; el honeypot identifica a los que pasan el captcha (o donde no hay captcha) analizando el comportamiento y campos trampa que solo un script llenaría. Usa ambos en conjunto para mejor cobertura.
¿Un honeypot puede banear a un jugador real por error?
Si está bien implementado, el riesgo es muy bajo, porque el honeypot depende de comportamientos que los humanos no hacen naturalmente (llenar un campo invisible, responder en milisegundos). Aun así, se recomienda aplicar un soft-block (retraso, captcha extra) en vez de un ban automático directo ante el primer disparo.
¿Necesito conocimiento avanzado de programación para montar un honeypot?
Un honeypot básico en el formulario de registro (campo invisible vía CSS) exige solo HTML/CSS y una verificación simple en el backend del sitio. Un honeypot más avanzado en el ConnectServer, analizando el patrón de paquetes, exige conocimiento de redes y del protocolo del emulador.
¿El honeypot ayuda contra bots de farmeo dentro del juego, no solo en el registro?
El honeypot descrito aquí se enfoca en registro y login. Para bots de farmeo in-game, la estrategia es diferente (detección de patrón de movimiento/ataque repetitivo, quest de verificación), pero ambos sistemas pueden coexistir en la estrategia general antibot del servidor.
¿Vale la pena divulgar públicamente que el servidor usa honeypot?
No se recomienda detallar la implementación públicamente, porque eso ayuda a los desarrolladores de bots a evadir el sistema. Es aceptable comunicar de forma genérica que el servidor tiene 'protección activa contra bots y multi-cuentas' sin revelar el mecanismo exacto.