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.