php - programas - fuerza bruta hackers
¿Cuál es el mejor método para prevenir un ataque de fuerza bruta? (3)
Intenta comprobar que estás tratando con un navegador real. Tal vez algunas de las secuencias de comandos java desagradables con nombres de funciones aleatorias o algo podrían bloquear muchas secuencias de comandos simples, a menos que controlen de forma remota un navegador real (lo que no es tan infrecuente), o evalúan el js / css correctamente en la secuencia de comandos scraper.
Recomendaría leer más sobre este tema y probar su solución contra Python Mechanize o alguna otra herramienta conocida de raspadores.
Pero uno es seguro, no hay una solución real contra los ataques automáticos.
Tengo mi página de inicio de sesión y, por supuesto, quiero evitar los ataques de fuerza bruta y causar menos retraso para los usuarios cuando inician sesión.
Actualmente, ingresa su nombre de usuario y contraseña para iniciar sesión.
Estoy considerando implementar un reCAPTCHA . Sin embargo, esto se muestra en el inicio de sesión después de 3 intentos fallidos.
Mi pregunta es:
¿En qué basas el intento? ¿Direcciones IP? Siempre se puede ocultar ... nombre de usuario? ¿Qué pasa si están intentando con un usuario que no existe?
¿Cuál sería el mejor método para contar los intentos de inicio de sesión fallidos?
Las sesiones no son confiables porque dependen de las cookies, los CAPTCHA se rompen regularmente [incluido ReCAPTCHA]. El único método confiable es engañosamente simple: hacer una pregunta. No use una pregunta de matemáticas porque las computadoras son sorprendentemente expertas en resolverlas por alguna razón. Los grandes recursos antiguos son cosas como:
- ¿Cuál es la cuarta palabra en el sexto párrafo en esta página ?
- ¿Cuál es el nombre del autor de este sitio? [hint]
Esto es estúpido, fácil de implementar y muy difícil de resolver para una máquina.
En cuanto a forzamiento, intente agregar dos campos a su tabla de usuario, ''first_failed_login'' [ INTEGER
unix timestamp o DATETIME
] y ''failed_login_count''. [ INTEGER
]
<?php
$bad_login_limit = 3;
$lockout_time = 600;
$first_failed_login, failed_login_count; // retrieve from DB
if(
($failed_login_count >= $bad_login_limit)
&&
(time() - $first_failed_login < $lockout_time)
) {
echo "You are currently locked out.";
exit; // or return, or whatever.
} else if( /* login is invalid */ ) {
if( time() - $first_failed_login > $lockout_time ) {
// first unsuccessful login since $lockout_time on the last one expired
$first_failed_login = time(); // commit to DB
$failed_login_count = 1; // commit to db
} else {
$failed_login_count++; // commit to db.
}
exit; // or return, or whatever.
} else {
// user is not currently locked out, and the login is valid.
// do stuff
}
Esto hará que su sistema de inicio de sesión reconozca solo 3 intentos de inicio de sesión por usuario cada 10 minutos.
No confíe en las sesiones o cookies, estas confían en el cliente y NUNCA debe confiar en el cliente. Hice una clase que se ocupa de la protección contra ataques de fuerza bruta en PHP.
https://github.com/ejfrancis/BruteForceBlocker
registra todos los inicios de sesión fallidos en todo el sitio en una tabla db, y si el número de inicios de sesión fallidos en los últimos 10 minutos (o cualquier período de tiempo que elija) supera un límite establecido, impone un retraso de tiempo y / o un requisito de captcha antes de iniciar sesión de nuevo.
ejemplo:
//build throttle settings array. (# recent failed logins => response).
$throttle_settings = [
50 => 2, //delay in seconds
150 => 4, //delay in seconds
300 => ''captcha'' //captcha
];
$BFBresponse = BruteForceBlocker::getLoginStatus($throttle_settings);
//$throttle_settings is an optional parameter. if it''s not included,the default settings array in BruteForceBlocker.php will be used
switch ($BFBresponse[''status'']){
case ''safe'':
//safe to login
break;
case ''error'':
//error occured. get message
$error_message = $BFBresponse[''message''];
break;
case ''delay'':
//time delay required before next login
$remaining_delay_in_seconds = $BFBresponse[''message''];
break;
case ''captcha'':
//captcha required
break;
}