¡Bienvenido! ¿Aún no estás registrado?, deberás registrarte antes de poder usar el Chat, Comentar y Descargar en el Foro. Usa un email válido para la activación.
Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5

COMPLEMENTOS Protección de Login v1.0
#1

0
Protección de Login v1.0
Nuevo módulo para Risus Nova 2.0 — PHPost


Protección contra ataques de fuerza bruta en el login. Bloquea automáticamente por IP y por nick tras demasiados intentos fallidos, con bloqueo progresivo y log completo de accesos visible desde el panel de admin.


Capturas
[img]Registrate o inicia tu sesión para ver este contenido[/img]
 
[img]Registrate o inicia tu sesión para ver este contenido[/img]
 
[img]Registrate o inicia tu sesión para ver este contenido[/img]
 
[img]Registrate o inicia tu sesión para ver este contenido[/img]


🛡️ Características
 
  • Doble bloqueo — por IP y por nombre de usuario de forma independiente
  • Bloqueo progresivo — 1er bloqueo 15 min, 2do 1 hora, 3er bloqueo y siguientes 24 horas
  • 5 intentos antes de bloquear (configurable en el código)
  • Admin nunca se bloquea
  • Login correcto resetea los contadores
  • Log completo — fecha, IP, nick y resultado de cada intento (guardado 7 días)
  • Panel en el admin — ver intentos y desbloquear manualmente con un clic
  • Aviso al usuario — muestra cuántos intentos le quedan antes del bloqueo
 


📋 Requisitos
 
  • Risus Nova 2.0 instalado y funcionando
  • PHP 8.0+
  • MySQL 5.7+ / MariaDB 10.4+
 


🛠️ Instalación

Paso 1 — Ejecutar el instalador

Sube la carpeta install/ a la raíz del sitio y accede a:
 
Registrate o inicia tu sesión para ver este contenido

Pulsa Instalar ahora. El instalador creará:
  • w_login_log — registro de todos los intentos de login
  • w_login_bloqueos — bloqueos activos por IP y nick

⚠️ Elimina la carpeta install/ del servidor cuando termine.


Paso 2 — Subir los archivos
 
inc/class/c.loginlog.php                  →  inc/class/
inc/php/ajax/ajax.loginlog.php            →  inc/php/ajax/
themes/default/css/loginlog.css          →  themes/default/css/
themes/default/templates/modules/
  m.loginlog_admin.tpl                    →  themes/default/templates/modules/

Paso 3 — En ajax.login.php

Abre inc/php/ajax/ajax.login.php y reemplaza el case 'login-user' completo por:

 
case 'login-user':
            //<---
                $user = $tsCore->setSecure($_POST['nick']);
                $pass = $tsCore->setSecure($_POST['pass']);
                $reme = (($_POST['rem'] ?? '') == 'true') ? true : false;
                //
                if(empty($user) or empty($pass)) echo '0: Faltan datos';
                else echo $tsUser->loginUser($user, $pass, $reme);
            //--->
        break;
 
Cambiar por:
 
case 'login-user':
    //<---
    $user = $tsCore->setSecure($_POST['nick']);
    $pass = $tsCore->setSecure($_POST['pass']);
    $reme = (($_POST['rem'] ?? '') == 'true') ? true : false;
    $ip   = $tsCore->getIP();

    if (empty($user) || empty($pass)) {
        echo '0: Faltan datos';
        break;
    }

    // ── Protección login ──
    require_once TS_CLASS . 'c.loginlog.php';
    $tsLL = new tsLoginLog();

    $bloqueo = $tsLL->estaBloqueado($user, $ip);
    if ($bloqueo) {
        $tiempo = $tsLL->formatearTiempo($bloqueo['faltan']);
        echo '0: Demasiados intentos fallidos. Inténtalo de nuevo en ' . $tiempo . '.';
        break;
    }

    $resultado = $tsUser->loginUser($user, $pass, $reme);

    if ($resultado === TRUE || is_numeric($resultado)) {
        $tsLL->registrar($user, $ip, true);
        $tsLL->resetear($user, $ip);
        echo $resultado;
    } else {
        $tsLL->registrar($user, $ip, false);
        $info = $tsLL->procesarFallo($user, $ip);
        $restantes = $info['restantes'];
        if ($restantes > 0) {
            echo $resultado . ' (' . $restantes . ' intento' . ($restantes != 1 ? 's' : '') . ' restante' . ($restantes != 1 ? 's' : '') . ')';
        } else {
            echo '0: Cuenta bloqueada temporalmente por seguridad.';
        }
    }
    // ────────────────────
    //--->
break;

Paso 4 — Panel en el admin (opcional)

Para ver el log desde el panel de admin añade en la plantilla t.admin.pl arriba de:

 

{elseif $tsAction == 'loginlog'}
                                {include file='admin_mods/m.loginlog_admin.tpl'}

En admin.php buscar:
 
} elseif($action == 'feed'){ 


Agregar antes:
 
} elseif($action == 'loginlog'){
    require_once TS_CLASS . 'c.loginlog.php';
    $tsLL = new tsLoginLog();
    $smarty->assign('tsLoginLog', $tsLL->getLog());
    $smarty->assign('tsBloqueos', $tsLL->getBloqueos());


En m.admin_sidemenu.tpl buscar:
 
<h4>Usuarios</h4>
<
ul class="admin-nav-list">
<
li id="a_users"><a href="{$tsConfig.url}/admin/users"><span class="nav-icon">👤</spanUsuarios</a></li>
<
li id="a_sesiones"><a href="{$tsConfig.url}/admin/sesiones"><span class="nav-icon">🔑</spanSesiones</a></li>
<
li id="a_nicks"><a href="{$tsConfig.url}/admin/nicks"><span class="nav-icon">🆔</spanNicks</a></li>
<
li id="a_rangos"><a href="{$tsConfig.url}/admin/rangos"><span class="nav-icon">💎</spanRangos</a></li>
</
ul


Debajo agregar:
 
<h4>Seguridad</h4>
<
ul class="admin-nav-list">
<
li id="a_loginlog"><a href="{$tsConfig.url}/admin/loginlog"><span class="nav-icon">🛡️</spanProtección Login</a></li>
</
ul


Paso 5 — Borrar la caché

Borra el contenido de la carpeta /cache/ del sitio.


🗑️ Desinstalar
 
DROP TABLE IF EXISTS w_login_log;
DROP TABLE IF EXISTS w_login_bloqueos;

Elimina los archivos subidos y restaura el case 'login-user' original en ajax.login.php.

 
Descarga

Mediafire
Debes agradecer para ver el contenido...

Google Drive
Debes agradecer para ver el contenido...



¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.
Responder


Compartir en:

Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)