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

Gracias por las respuestas!

Cita:
Iniciado por ocp001a Ver Mensaje
Sería bueno que mostraras cómo revisas si la ip ya tiene x intentos, ya que por medio de la ip podrían inyectarte código sql si no filtras el valor de la ip.
En primer lugar, la IP la obtengo de la siguiente forma:
Código PHP:
Ver original
  1. if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $global_ip_usuario = $_SERVER['HTTP_CLIENT_IP']; } else {
  2.     if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $global_ip_usuario = $_SERVER['HTTP_X_FORWARDED_FOR']; } else {
  3.     $global_ip_usuario = $_SERVER['REMOTE_ADDR']; } }

La IP la tengo siempre accesible en la variable $global_ip_usuario;

En el código que postee al principio, hay una parte que cuando llegas a los 10 intentos te bloquea la posibilidad de login por sesion.... ahi simplemente he añadido un INSERT INTO a una tabla con Ips bloqueadas:

Código PHP:
Ver original
  1. $hora = strtotime('+10 minutes');
  2.  
  3. $query_bloqueo_ip = mysqli_query($link,"
  4.             INSERT INTO black_ips (ip,motivo,id_usuario,timestamp) VALUES (
  5.             '$global_ip_usuario',
  6.             'Has alcanzado el número máximo de intentos en el inicio de sesión.',
  7.             1,
  8.             $hora
  9.             )");

Una vez añado la IP a la lista negra, si esta intenta acceder la bloqueo!

Tengo un fichero "seguridad.php" que esta a modo de include(); en la primera linea de todos mis ficheros... Este tiene una parte al principio del todo donde hago lo siguiente:

Código PHP:
Ver original
  1. // compruebo lista negra de IPs antes de continuar con los links a las BD
  2.     // primero saco la IP del usuario
  3.     if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $global_ip_usuario = $_SERVER['HTTP_CLIENT_IP']; } else {
  4.     if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $global_ip_usuario = $_SERVER['HTTP_X_FORWARDED_FOR']; } else {
  5.     $global_ip_usuario = $_SERVER['REMOTE_ADDR']; } }
  6.    
  7.     $hora_actual = strtotime('now');
  8.     $result = mysqli_query($link, "SELECT black_ips.motivo,usuarios.nickname,black_ips.timestamp  
  9.     FROM black_ips, usuarios
  10.     WHERE black_ips.ip='$global_ip_usuario'
  11.     AND black_ips.id_usuario=usuarios.id_usuario
  12.     AND black_ips.timestamp>$hora_actual");
  13.     $contador_result = mysqli_num_rows($result);
  14.     if($contador_result>=1) {
  15.         $global_errores = 1;
  16.         $global_error_txt = "<p>SU DIRECCI&Oacute;N IP <b>$global_ip_usuario</b> SE ENCUENTRA EN LA <b>LISTA NEGRA</b>:</p>";
  17.         while($row=mysqli_fetch_array($result)) {
  18.             $global_error_txt .= " - <b><span style='color:red'>@".$row[1]."</span></b> a&ntilde;adio el siguiente motivo:
  19.                                 <b><i>".$row[0]."</i></b><br/>";
  20.             $horas_restantes_bloqueo = (($row[2]-$hora_actual)/60)/60;
  21.             $global_error_txt .= "[$horas_restantes_bloqueo horas restantes para la eliminaci&oacute;n de este bloqueo]<br/><br/>";
  22.         }
  23.     } else {
  24.         //este 'else' indica que no se encuentra en la lista negra de IPs... asi que continuamos:


Cita:
Iniciado por bookmaster Ver Mensaje
Sobre el tema de bloquear las IP's, te puedo decir por experiencia, que te hacen el ataque desde diversas IP's a la vez ya que usan proxys.

He llevado un seguimiento de por donde han tratado de entrar en una de las webs que llevo y generan mas de 10 intentos en menos de 5 segundos al mismo, probé a bloquearlas desde SQL, .htacess, y tal pero es tontería por lo que te acabo de comentar.

La mejor opción es bloquear la cuenta directamente cuando superen dicho número de intentos, y después de un cierto tiempo desbloquearla, por si el usuario real quiere volver a entrar.

Otra opción es controlar la ubicación del que trata de acceder, tipo lo que hace google, si por ejemplo te conectas siempre desde la ubicación X, y un día de buenas a primeras tras diferentes intentos se conecta desde una ubicación Y, bloqueas la cuenta en el momento, cambias la contraseña automáticamente generando una aleatoria y le mandas un mail a la cuenta de correo con la que se registró dicho usuario con un aviso de que su cuenta a sido comprometida y los pasos para modificar la contraseña.
Gracias! Creo que si que es buena idea lo que comentas.
Actualmente tengo una tabla donde almaceno las ultimas 10 IPs con las que ha accedido un usuario... y el propio usuario lo puede ver desde su perfil.

Aun tengo que dar una vuelta a tu comentario para ver como lo hago, pero lo primero que se me viene a la cabeza es crear una nueva columna que ponga "intentos_login_fallidos" y que sume 1 cada vez que falla el login....
Si este valor llega a 10: bloquear la cuenta, y enviar email al usuario para desbloquearla mediante la generacion de nueva password.
Tambien hacer que si son 5 intentos fallidos seguidos... bloquear BIS a lo anterior.

Un saludo.
__________________
Follow me on twitter @franbedia

Última edición por fbedia; 07/08/2014 a las 02:32 Razón: Errata