Muy buenas!
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 originalif(isset($_POST['start'])) { // Comprobamos si existe la variable intentos_start
if(isset($_SESSION['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;
echo "<p>tienes que esperar todabia ".substr($tiempo_restante_min,0,1)." minutos</p>"; }
}
if($_SESSION['intentos_start']<10) {
// Realizamos la comprobacion del login
// 1º Comprobamos la recepcion del usuario y password
if(isset($_POST['password']) && isset($_POST['username'])) { //2º Escapamos los valores recibidos
//3º Comprobamos la longitud que debe estar entre 2 y 25 caracteres el usuario y minimo 4 la password
$long_username=strlen($username); $long_password=strlen($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
$query_usuario = mysqli_query($link_db,"SELECT password FROM usuarios WHERE nickname='$username'"); // Comprobamos que exista el usuario
if($existe_usuario==1) {
// Comprobamos que la password coincida con la recibida del form
if($row1['password']==md5($password)) { // 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"> <input type="text" class="form-control" id="username" name="username" title="Usuario" placeholder="Usuario" /> <input type="password" class="form-control" id="password" name="password" title="Password" placeholder="Password" /> <ul class="list-unstyled pull-left"> <li><a href="#">Recuperar password
</a></li> <li><a href="#">Crear cuenta
</a></li> <button type="submit" name="start" class="btn btn-custom pull-right">Start
</button>