¿Cuál es la mejor manera de enumerar los intentos de registro / inicio de sesión?

2

Para iniciar sesión a través de un sitio web, ¿cuál es la mejor manera de contar el número de intentos que es:

  • menos vulnerable a la manipulación
  • confiable
  • rápido

El sistema:

  • use HTTPS durante la fase de inicio de sesión (al menos)
  • use algún tipo de hashing dependiente del tiempo como BCrypt
  • utilizar cookies para almacenar sesiones
  • use una base de datos para almacenar los detalles del usuario, incluyendo cosas como la última vez que ingresó

Veo, por ejemplo, algunos sitios usan un número como parámetro de consulta en url. Yo no usaría esto personalmente, pero puede haber alguna razón para no ver esto, de ahí la pregunta.

Perdóneme si esto se ha cubierto en otra parte del sitio. Quería mantener esto como una pregunta de ámbito limitado y puede que se haya tratado en otra parte, pero no la he encontrado. Los enlaces serán más que bienvenidos, al igual que cualquier información o sugerencia.

    
pregunta Iain 16.11.2012 - 15:08
fuente

1 respuesta

2

Es necesario que al menos intente implementar el recuento en un nivel por cuenta y por IP, de modo que se bloquee el descifrado de contraseñas, independientemente de si se trata de una cuenta y muchas contraseñas, o muchas cuentas. y algunas contraseñas comunes.

La mejor manera de hacer el recuento es registrar los intentos en una tabla de base de datos y luego calcular el recuento en tiempo de ejecución mediante una consulta. Podría usar un conjunto de consultas como esta para calcular los conteos:

// get the last successful login time.
// if this returns no rows, default it to 2000-01-01 00:00:00 or similar
SELECT TOP(1) attempt_time AS last_success_time
FROM login_attempts
WHERE success = 0

SELECT MAX(tmp.attempt_count) AS attempt_count // we want the highest count
FROM (

  SELECT COUNT(*) AS attempt_count
  FROM login_attempts
  WHERE
    attempt_time > $last_success_time // only count from the last successful login
    and success = 0
    and ip_address = $ip; // count by IP

  UNION

  SELECT COUNT(*) AS attempt_count
  FROM login_attempts
  WHERE
    attempt_time > $last_success_time // only count from the last successful login
    and success = 0
    and user_id = $uid; // count by user ID

) tmp;

Otra cosa a tener en cuenta es los proxies. La mayoría de la gente se preocupa por ellos e intenta usar encabezados como X-Forwarded-For para bloquear las IP de origen. El problema con esto es que un atacante puede configurar X-Forwarded-For y utilizarlo para prohibir cualquier dirección IP, simplemente al no poder iniciar sesión. Como tal, debe verificar las prohibiciones existentes basadas en X-Forwarded-For y la IP de origen, pero nunca establece nuevas prohibiciones basadas en el encabezado. Esto significa que los usuarios que intentan evadir las prohibiciones mediante el uso de un proxy serán capturados si el proxy proporciona X-Forwarded-For , pero los atacantes no pueden falsificarlo a través de él. También tiene el efecto secundario de prohibir los proxies que se utilizan para los ataques, lo que es una buena ventaja.

    
respondido por el Polynomial 16.11.2012 - 15:51
fuente

Lea otras preguntas en las etiquetas