establecer un límite en los intentos de recuperación de contraseña

7

en una configuración donde uno ha olvidado su contraseña, me gustaría poder limitar los intentos de ingresar direcciones de correo electrónico a algo como 10. Mi primer pensamiento fue usar una cookie.

$attempts = 0;

if( isset( $_COOKIE['password_recovery_attempts'] ) ) 
  $attempts = $_COOKIE['password_recovery_attempts'];

if( $pass === false ){
  $val = $attempts + 1;
  setcookie( 'password_recovery_attempts', $val, time() + 86400 ); //86400 = 1 day
}

if( $attempts > 9 ){
  echo 'You have attempted to reset your password too many times';
  return false;
}

Mi preocupación con solo usar una cookie es que las cookies se pueden eliminar fácilmente. ¿Qué sería una mejor práctica aquí?

    
pregunta Tony 13.03.2013 - 02:59
fuente

3 respuestas

11

Tienes razón en que una cookie es una mala idea, pero el enfoque en sí mismo es erróneo.

El problema con este tipo de límites estrictos es que facilitan que un atacante cree una condición DoS para el usuario legítimo, simplemente ingresando 10 direcciones de correo electrónico incorrectas. Incluso si retrasas los intentos, el atacante simplemente puede enviar una solicitud cada vez que el límite de tiempo caduque.

La forma en que lo implementaría sería limitar por tiempo las solicitudes por IP, por cuenta, sin demora después del primer y segundo intento, pero aumentando las demoras en intentos consecutivos hasta un límite de 45 segundos. Otra medida útil sería imponer demoras de 45 segundos en cualquier solicitud proveniente de una dirección IP que haya visto más de 10 intentos incorrectos en los últimos 15 minutos en cualquier número de cuentas, para proteger contra ataques que analizan la lista completa de nombres de usuarios. contra una sola dirección de correo electrónico conocida. También podría considerar requerir un CAPTCHA después de un cierto número de intentos fallidos, para protegerme de ataques automatizados.

Esto proporciona los siguientes beneficios:

  • Un cliente legítimo siempre podrá usar la función (es decir, no se puede alcanzar la condición DoS) siempre que el atacante esté usando una dirección IP diferente que se enfrenta públicamente.
  • Se puede realizar un número razonable de intentos fallidos sin que el usuario se vea obstaculizado por los mecanismos de bloqueo.
  • Tanto los ataques dirigidos como los ataques de frutas de baja altura se ven obstaculizados con efectos negativos mínimos sobre los usuarios legítimos.
  • El peor de los casos es que un atacante genera una condición DoS cuando está en la misma red que un usuario legítimo. No exactamente crítico o probable.

Esto implicaría almacenar intentos fallidos en un registro en el lado del servidor, tal vez en una tabla de base de datos o en un caché en memoria.

    
respondido por el Polynomial 13.03.2013 - 04:20
fuente
1

Nunca puede confiar en el cliente, y usar una cookie es solo eso: está confiando en que el cliente (posiblemente un atacante) le envíe información precisa. Para que esto funcione correctamente, deberías almacenar este servidor.

Puede almacenar el recuento de intentos de restablecimiento con los datos de la cuenta, y simplemente restablecerlo a 0 si el inicio de sesión es exitoso, es factible para sitios más pequeños. Para sitios más grandes, querría almacenar los datos en un almacén de datos separado, con conexión de memoria o similar (probablemente utilizando el mecanismo que use para los datos de las sesiones del lado del servidor).     

respondido por el Adam Caudill 13.03.2013 - 04:13
fuente
1

Debes bloquear el lado del servidor de la cuenta. Establecer una cookie o prohibir temporalmente una IP puede ser burlado por el cliente. Yo sugeriría que se trabaje un mecanismo para deshabilitar el reinicio del usuario después de los intentos fallidos de x Su script PHP debe verificar su base de datos si los intentos exceden de x .

    
respondido por el aus 13.03.2013 - 04:22
fuente

Lea otras preguntas en las etiquetas