Phpost
COMPLEMENTOS Protección de Login v1.0 - Versión para impresión

+- Phpost (https://phpost.es)
+-- Foro: Risus Nova 2.0 (https://phpost.es/forum-150.html)
+--- Foro: Complementos (https://phpost.es/forum-164.html)
+--- Tema: COMPLEMENTOS Protección de Login v1.0 (/thread-986.html)



Protección de Login v1.0 - Tronlar - 05-27-2026

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
   


📋 Requisitos
   


🛠️ Instalación

Paso 1 — Ejecutar el instalador

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

Pulsa Instalar ahora. El instalador creará:
⚠️ Elimina la carpeta install/ del servidor cuando termine.


Paso 2 — Subir los archivos
 
Código:
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:

 
Código:
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:
 
Código:
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:

Código:
{/if}
 

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

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


Agregar antes:
 
Código:
} 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:
 
Código PHP:
<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:
 
Código PHP:
<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
 
Código:
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
http://Registrate o inicia tu sesión para ver este contenido

Google Drive
http://Registrate o inicia tu sesión para ver este contenido



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