php

PHP – Login con límite de intentos usando MySQL

En este artículo de programación con PHP y MySQL te mostraré cómo implementar un login, autenticación o inicio de sesión con límite de intentos, teniendo a MySQL como base de datos.

PHP y MySQL – Login con máximo número de intentos

Con el límite de intentos me refiero a que cuando el usuario coloque la contraseña incorrecta, se irá aumentando un contador de errores o de intentos fallidos. Si llega a determinado número, se bloqueará el acceso hasta que el contador se reinicie.

Este ejemplo completo de código que te mostraré tiene el módulo de login, de creación de usuarios y de usuarios en donde se pueden borrar los intentos fallidos de cualquier usuario.

Además, solo los usuarios que hayan iniciado sesión pueden acceder a la administración de usuarios del sistema. Recuerda que para guardar todos los datos vamos a usar MySQL y vamos a usar PHP como lenguaje de programación.

Base de datos

Comencemos viendo la base de datos. Como en varios de mis proyectos, las credenciales de acceso residen en un archivo llamado env.php que tú debes crear, basándote en el archivo env.ejemplo.php. El mío se ve así:

See the gist on github.

Fíjate en que mi base de datos se llama login. Configura el nombre de la base de datos, misma que debe existir en tu sistema, y luego importa las tablas:

See the gist on github.

En este caso tenemos solo dos tablas. Una que guardará todos los datos de los usuarios y otra que guardará cuántos intentos fallidos tiene un usuario, misma que podemos usar para saber si el usuario puede acceder o no, y que iremos alimentando cada vez que haya un error de autenticación.

La tabla de intentos está relacionada a la tabla de usuarios correctamente. Ya después leemos el archivo y obtenemos una conexión con las siguientes funciones:

See the gist on github.

Formulario para login

Comencemos viendo el formulario en donde se inicia sesión, pues ahí se hace todo. El mismo solo solicita el correo y la contraseña. También muestra un mensaje en caso de que el mismo esté presente en la URL:

See the gist on github.

Cuando el formulario sea enviado se va a procesar en login.php que va a revisar que los datos estén presentes y después va a invocar a la función hacerLogin, misma que veremos más tarde. Por ahora los comentarios explican todo:

See the gist on github.

Como puedes ver hacemos simples redirecciones, y en caso de que todo vaya bien, iniciamos la sesión para ir a la página de administración de usuarios.

Comprobando límite y registrando errores

Vayamos a la función que hace la magia, misma que vimos anteriormente y que es hacerLogin. Aquí es en donde se verifica la contraseña como los intentos, y se guarda el intento fallido en caso de existir:

See the gist on github.

Lo primero que hacemos es obtener el usuario de la base de datos. Si no existe, no se lo indicamos (pues es un riesgo de seguridad), solo le decimos que su contraseña o correo es incorrecto.

Después obtenemos los intentos fallidos que tiene y, si supera el máximo, lo indicamos, ya que no puede iniciar sesión si supera el máximo de intentos.

Finalmente en caso de que pueda acceder, comprobamos su contraseña. La comparamos y si todo va bien entonces el login es correcto, así que borramos los intentos fallidos.

Caso contrario, si la contraseña es incorrecta y por lo tanto hay un intento fallido, agregamos un intento fallido a ese id de usuario.

Registro de usuarios

Registro de usuarios – Ejemplo de inició de sesión con PHP usando límite de intentos

El sistema cuenta con un módulo simple de registro de usuarios, que solo está para no tener que ingresar los datos manualmente. El código del formulario es el siguiente:

See the gist on github.

Cuando se envía, los datos se procesan en registrar_usuario.php cuyo código es el siguiente, en donde se invoca, de nuevo, a una función:

See the gist on github.

El código de la función queda así:

See the gist on github.

Administración de usuarios

Administración de usuarios con interfaz para reiniciar el contador de intentos fallidos

Si el usuario inició sesión correctamente se le muestra una página en donde puede reiniciar el conteo de intentos fallidos gracias a un enlace que aparece junto al correo y el conteo de los usuarios. El código que dibuja la tabla y el enlace para el reseteo es:

See the gist on github.

Como te puedes dar cuenta, se verifica si el usuario ha iniciado sesión antes, por lo que se puede decir que esta página está protegida. Yo sé que no tiene sentido que un usuario pueda reiniciar el contador de intentos fallidos, pero recuerda, es un simple ejemplo, puedes adaptarlo a tus necesidades.

Ya para la parte de reiniciar el conteo, se hace lo siguiente:

See the gist on github.

Siguiendo el patrón de todas las demás acciones, este archivo simplemente incluye el archivo de funciones.php e invoca a la que es necesaria. La función luce así:

See the gist on github.

Poniendo todo junto

Así queda este proyecto completo en donde se implementa un límite de intentos y no se permite el acceso hasta que el administrador reinicia el contador de intentos fallidos.

No puedo colocar aquí todo el código e ir explicando paso por paso cada cosa, pues el artículo se haría realmente largo.

Aquí solo te he explicado el código relevante, ya que en otros posts he explicado lo que es la conexión de PHP a MySQL, la plantilla de Bootstrap, la subconsulta con count o un login básico con PHP.

Te dejo el código completo en un repositorio de GitHub en donde encontrarás el archivo de funciones completas, el esquema, etcétera. Y también te dejo más posts sobre PHP.

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

No te pierdas ninguno de mis posts

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

JavaScript (lado del cliente): leer pixeles de imagen

En ocasiones es necesario leer los pixeles y colores de una imagen con JavaScript del…

5 días hace

PHP y JavaScript: llenar select con AJAX

Siguiendo con los tutoriales de listas desplegables o select con JavaScript, vamos a ver cómo…

6 días hace

Imprimir PDF generado con HTML

Hoy vamos a ver programar la impresión de un PDF generado a partir de HTML…

7 días hace

JavaScript: llenar select con arreglo

En este tutorial básico de JavaScript con HTML vamos a ver cómo llenar una lista…

2 semanas hace

Imprimir PDF a partir de URL

En este artículo se presenta una guía para imprimir un PDF a partir de una…

2 semanas hace

Imprimir PDF a partir de base64

En este post voy a enseñarte cómo imprimir un PDF a partir de su representación…

2 semanas hace

Esta web usa cookies.