2011-06-15 73 views
5

Quiero limitar los intentos fallidos de inicio de sesión. Por ejemplo, si un usuario específico intenta iniciar sesión con el nombre de usuario o contraseña incorrectos 4 veces, debería mostrar el CAPTCHA 4ª vez en lugar de bloquear durante un tiempo específico, y seguir mostrando CAPTCHA a menos que proporcione un nombre de usuario y contraseña válidos. Una vez que el usuario ha iniciado sesión correctamente, el intento de inicio de sesión se restablece a CERO.Limitación del número de intentos de inicio de sesión fallidos

¿La idea de verificar el nombre de usuario en lugar de la dirección IP es correcta desde el punto de vista de la seguridad? ¿Se puede implementar este enfoque sin usar la base de datos ?, ya que creo que no necesito almacenar tiempo porque simplemente mostraré recaptcha? Por favor, dé su opinión.

+1

http://stackoverflow.com/questions/580534/best-way-to-limit-and-record-login-attempts http://stackoverflow.com/questions/679756/limiting-user-login-attempts- in-php – Jacob

Respuesta

8

¿No desea utilizar la base de datos para el "número de inicios de sesión fallidos"? Entonces solo usa una cookie y revísalo. Claro, pueden eliminarlo, pero es una molestia.

Sin embargo,, sospecho que ya está obteniendo el nombre de usuario y la contraseña de la base de datos, ¿por qué no recuperar el último número de inicios de sesión fallidos mientras lo hace?

if (isset($_POST['submit_login'])) { 

    if (isset($_POST['username']) && isset($_POST['password'])) { 
     $username = mysql_real_escape_string($_POST['username']); 
     $password = mysql_real_escape_string($_POST['password']); 
     // id = unique primary key 
     $rs = mysql_query('SELECT id,Username,Password,Failed_logins,IP_address FROM Users WHERE Username = '.$username.''); 
     $num = mysql_num_rows($rs); 
     if ($num > 0) { 
      // I would add a password hash here to $password, and check against the hashed Password from the database 
      // But let's check the clean passwords 
      $row = mysql_fetch_array($rs); 
      if ($password == $row['Password']) { 
       // Successful login, set session or whatever you need 
       // Reset failed logins 
       mysql_query('UPDATE Users SET Failed_logins = 0 WHERE id = '.$row['id'].''); 
       header('location: success.php'); 
      } else { 
       // Failed password check 
       if ($row['Failed_logins'] > 3) { 
        // Redirect to captcha 
        header('location: captcha.php'); 
       } else { 
        $ip = $_SERVER['REMOTE_ADDR']; 
        if ($row['IP_address'] != $ip) { 
         // New ip adress, reset failed logins 
         $failed_logins = 0; 
        } else { 
         // Increment failed logins 
         $failed_logins = $row['Failed_logins']+1; 
        } 
        mysql_query('UPDATE Users SET Failed_logins = '.$failed_logins.',IP_address = '.$ip.' WHERE id = '.$row['id'].' '); 
       } // End check Failed_logins > 3 
      } 
     } else { 
      // No such Username found in database 
      $error = 'no_such_username'; 
     } // End username check from database 

    } else { 
     // Either username or password is missing 
     $error = 'incomplete_form'; 
    } // end check for username and password 

} // end main submit_login check 

Algo así.

EDIT:

Este es un código muy viejo y veo algunos problemas con él ahora. Pero, al menos, siempre debe usar PDO (declaraciones preparadas) para insertar datos en su base de datos.

+2

Recuerde restablecer 'Failed_logins' luego de iniciar sesión con éxito. – jensgram

+0

sí, eso es bueno. ¿Entonces fail_login debería reiniciarse solo después de iniciar sesión correctamente? entonces, incluso si una persona intenta después de un año, ¿no lo permitirá? ¿Debo agregar otra columna como login_time y comparar la hora? digamos que una persona puede probar 3 veces en 24 horas solamente? ¿es buena idea? – Roman

+0

¿Qué sucede si un atacante sigue suministrando nombres de usuario inexistentes? – Roman

0

Debe guardar los intentos en una base de datos y consultar al usuario.

1

¿Qué estás protegiendo?

Contenido aleatorio solo para el usuario, nombre de usuario.

Información bancaria (lo dudo ...) u otros datos confidenciales, IP podría estar bien, siempre que utilice rangos.

¿Está preguntando cómo hacerlo o cuál debería usar?

1

Necesita tiempo, ¿cómo podría determinar si un intento de inicio de sesión ha expirado? Si no pudiera iniciar sesión 4 veces durante un período de 10 años, me bloquearían. Desea bloquear a aquellos que intentan múltiples intentos de inicio de sesión en un corto espacio de tiempo.

Le sugiero que use una base de datos, ya que mantendrá un historial detallado de los inicios de sesión al mismo tiempo. Pero una solución basada en memoria como memcached también podría ser suficiente.

Para explicar qué seguridad implementar: una combinación!

Combine el nombre de usuario y la dirección IP utilizados y guárdelos en su base de datos.

  1. Utilice los intentos de acceso a su nombre de usuario para proteger directamente a sus usuarios de los intentos.
  2. Utilice la información de la dirección IP para observar solo una detección, y tome medidas si es necesario.
+0

gracias por la idea. Ahora, ¿sería más útil almacenar el nombre de usuario o la dirección IP del usuario? ¿Qué sucede si un atacante sigue suministrando un nombre de usuario y una contraseña inexistentes? – Roman

0

La mejor manera de hacerlo es usar bases de datos.

Es necesario crear una tabla separada en su base de datos, que almacenaría tres variables:

(a) la dirección IP (en el que la persona está tratando de conectarse) (b) Número de intentos de conexión (c) la fecha/hora (o: corriente de marca de tiempo)

el único problema con este enfoque es la primera variable: dirección IP

¿Qué pasa si la persona está en un café Internet? ¿O usar Wi-Fi público? ¿O Hotspot? O, una escuela? ¿oficina? etc., etc.

Si bloquea la dirección IP, afecta a todos los que intentan iniciar sesión en su sitio web desde esa ubicación.

Esto no es un problema si su sitio web se refiere a algo así como un banco, una instalación militar o el Pentágono.

Pero, si su sitio web es un negocio (comprar y vender, juego, lo que sea), ¡bloquear una dirección específica solo molestará a sus clientes!

Cuestiones relacionadas