Ver Mensaje Individual
  #1 (permalink)  
Antiguo 31/07/2014, 06:26
Avatar de fbedia
fbedia
 
Fecha de Ingreso: julio-2010
Mensajes: 159
Antigüedad: 13 años, 9 meses
Puntos: 8
Sistema de LOGIN definitivo

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 original
  1. if(isset($_POST['start'])) {
  2.     // Comprobamos si existe la variable intentos_start
  3.     if(isset($_SESSION['intentos_start'])) {
  4.         if($_SESSION['intentos_start']<10) {
  5.             $_SESSION['intentos_start']=$_SESSION['intentos_start']+1;
  6.         }
  7.     } else {
  8.         $_SESSION['intentos_start']=1;
  9.     }
  10.    
  11.     if($_SESSION['intentos_start']==10) {
  12.         // Establezco el tiempo para proximo intento
  13.         $hora = strtotime('+10 minutes');  
  14.         $_SESSION['time_to_start']=$hora;
  15.         $_SESSION['intentos_start']=$_SESSION['intentos_start']+1;
  16.         echo "<p>HAS ALCANZADO EL MAXIMO DE INTENTOS... ESPERA 10 MINUTOS</p>";
  17.     } else {
  18.         if($_SESSION['intentos_start']>10) {
  19.             // Comprobamos si ya ha esperado el tiempo suficiente
  20.             $hora = strtotime('now');
  21.             if($hora>$_SESSION['time_to_start']) {
  22.                 // Si la hora es mayor, es que ya ha esperado el tiempo suficiente para volver a intenarlo
  23.                 // Al resetear la variable intentos_start entrara en el bucle de CONSULTA A BD
  24.                 $_SESSION['intentos_start']=1;
  25.             } else {
  26.                 // Aun no ha esperado lo suficiente
  27.                 $tiempo_restante_seg = $_SESSION['time_to_start']-$hora;
  28.                 $tiempo_restante_min = $tiempo_restante_seg/60;
  29.                 echo "<p>tienes que esperar todabia ".substr($tiempo_restante_min,0,1)." minutos</p>";
  30.             }
  31.         }
  32.         if($_SESSION['intentos_start']<10) {
  33.             // Realizamos la comprobacion del login
  34.             // 1º Comprobamos la recepcion del usuario y password
  35.             if(isset($_POST['password']) && isset($_POST['username'])) {
  36.                 //2º Escapamos los valores recibidos
  37.                 $username=addslashes($_POST['username']);
  38.                 $password=addslashes($_POST['password']);
  39.                 //3º Comprobamos la longitud que debe estar entre 2 y 25 caracteres el usuario y minimo 4 la password
  40.                 $long_username=strlen($username);
  41.                 $long_password=strlen($password);
  42.                 if(($long_username<2)||($long_username>25)||($long_password<4)||($long_password>25)) {
  43.                     echo "<p>LONGITUD INVALIDA USUARIO Y PASSOWRD</p>";
  44.                 } else {
  45.                     // Comprobamos que solo haya numeros o letras
  46.                     if((preg_match("/^[0-9a-zA-Z]+$/", $username))&&(preg_match("/^[0-9a-zA-Z]+$/", $password))) {
  47.                         // Llegados a este punto, no seria necesario hacer un mysqli_real_escape_string...
  48.                         // pero se lo hare por prevenir:
  49.                         $username=mysqli_real_escape_string($link_db,$username);
  50.                         // Consultamos el usuario en la BD
  51.                         $query_usuario = mysqli_query($link_db,"SELECT password FROM usuarios WHERE nickname='$username'");
  52.                         // Comprobamos que exista el usuario
  53.                         $existe_usuario=mysqli_num_rows($query_usuario);
  54.                         if($existe_usuario==1) {
  55.                             $row1 = mysqli_fetch_array($query_usuario, MYSQLI_ASSOC);
  56.                             // Comprobamos que la password coincida con la recibida del form
  57.                             if($row1['password']==md5($password)) {
  58.                                 // Login success
  59.                                 // Asignamos las variables de sesion... permisos... oportunos:
  60.                                 echo "usuario y pass correctos....";
  61.                             } else {
  62.                                 echo "PASSWORD INCORRECTA";
  63.                             }
  64.                         } else {
  65.                             echo "EL USUARIO NO EXISTE $username";
  66.                         }
  67.                     } else {
  68.                         echo "CARACTERES NO ADMITIDOS";
  69.                     }
  70.                 }
  71.             } else {
  72.                 echo "<p>NO SE RECIBIO USUARIO Y PASSOWRD</p>";
  73.             }
  74.         }
  75.     }
  76. }


y el form:

Código HTML:
Ver original
  1. <form action="procesar" method="post">
  2.                                         <div class="form-group">
  3.                                             <input type="text" class="form-control" id="username" name="username" title="Usuario" placeholder="Usuario" />
  4.                                         </div>
  5.                                         <div class="form-group">
  6.                                             <input type="password" class="form-control" id="password" name="password" title="Password" placeholder="Password" />
  7.                                         </div>
  8.                                         <ul class="list-unstyled pull-left">
  9.                                             <li><a href="#">Recuperar password</a></li>
  10.                                             <li><a href="#">Crear cuenta</a></li>
  11.                                         </ul>
  12.                                         <button type="submit" name="start" class="btn btn-custom pull-right">Start</button>
  13.                                     </form>
__________________
Follow me on twitter @franbedia