He creado desde 0 un sistema de LOGIN que me gustaría que revisaran!
Creo que es 100% seguro e impenetrable, aunque quizás aún se pueda mejorar más?? alguna validación que me falte o me sobre??
Quiero que si el usuario realiza 10 intentos de login fallidos... que el sistema le bloquee durante 10 minutos. Para hacer esto, uso una variable de sesion.
No estoy puesto en temas de fuerza bruta... pero ¿quizas un programa de estos pueda realizar un intento de inicio de sesion... despues matar la sesion... y hacer otro? De esta forma se saltaria la comprobacion echa.... :(
Bueno... os dejo el código y quedo a la espera de sus comentarios.
Tengan en cuenta que los echo "---"; son meras trazas...
Saludos!
Código PHP:
Ver original
// Comprobamos si existe la variable intentos_start if($_SESSION['intentos_start']<10) { $_SESSION['intentos_start']=$_SESSION['intentos_start']+1; } } else { $_SESSION['intentos_start']=1; } if($_SESSION['intentos_start']==10) { // Establezco el tiempo para proximo intento $_SESSION['time_to_start']=$hora; $_SESSION['intentos_start']=$_SESSION['intentos_start']+1; echo "<p>HAS ALCANZADO EL MAXIMO DE INTENTOS... ESPERA 10 MINUTOS</p>"; } else { if($_SESSION['intentos_start']>10) { // Comprobamos si ya ha esperado el tiempo suficiente if($hora>$_SESSION['time_to_start']) { // Si la hora es mayor, es que ya ha esperado el tiempo suficiente para volver a intenarlo // Al resetear la variable intentos_start entrara en el bucle de CONSULTA A BD $_SESSION['intentos_start']=1; } else { // Aun no ha esperado lo suficiente $tiempo_restante_seg = $_SESSION['time_to_start']-$hora; $tiempo_restante_min = $tiempo_restante_seg/60; } } if($_SESSION['intentos_start']<10) { // Realizamos la comprobacion del login // 1º Comprobamos la recepcion del usuario y password //2º Escapamos los valores recibidos //3º Comprobamos la longitud que debe estar entre 2 y 25 caracteres el usuario y minimo 4 la password if(($long_username<2)||($long_username>25)||($long_password<4)||($long_password>25)) { echo "<p>LONGITUD INVALIDA USUARIO Y PASSOWRD</p>"; } else { // Comprobamos que solo haya numeros o letras // Llegados a este punto, no seria necesario hacer un mysqli_real_escape_string... // pero se lo hare por prevenir: // Consultamos el usuario en la BD // Comprobamos que exista el usuario if($existe_usuario==1) { // Comprobamos que la password coincida con la recibida del form // Login success // Asignamos las variables de sesion... permisos... oportunos: echo "usuario y pass correctos...."; } else { echo "PASSWORD INCORRECTA"; } } else { echo "EL USUARIO NO EXISTE $username"; } } else { echo "CARACTERES NO ADMITIDOS"; } } } else { echo "<p>NO SE RECIBIO USUARIO Y PASSOWRD</p>"; } } } }
y el form:
Código HTML:
Ver original
<form action="procesar" method="post"> <div class="form-group"> <input type="text" class="form-control" id="username" name="username" title="Usuario" placeholder="Usuario" /> </div> <div class="form-group"> <input type="password" class="form-control" id="password" name="password" title="Password" placeholder="Password" /> </div> <ul class="list-unstyled pull-left"> </ul> </form>