2011-01-27 25 views
12

He configurado mi base de datos para registrar cada intento fallido de inicio de sesión. Pensé que multiplicaría la cantidad de intentos fallidos con 0.05 segundos o algo así. Algo así como:aumentando la demora de inicio de sesión para detener la fuerza bruta, ¿buena idea?

  time_nanosleep(0, (50000000 * $failed_attempts)); 

Más intentos de un hacker utiliza para adivinar una contraseña, más tiempo se tarda en comprobar cada vez. Después de revisar 100 pasords, debe esperar 5 segundos entre cada intento.

¿Es esta una buena manera de detener la fuerza bruta? Identifico a los usuarios por IP. Así que supongo que puedes aplicar fuerza bruta usando múltiples servidores proxy o algo así, pero además de eso, creo que es una buena idea. ¿Qué piensan ustedes?

Respuesta

9

¿Qué pasa algo como:

time_nanosleep(0, (10000000000 * (log($failed_attempts)^10))); 

Esto le dará una ventana intento de aumentar exponencialmente.

+0

sí, eso es mucho mejor. – ganjan

1

No debe ser toda su estrategia contra la fuerza bruta, pero es un componente excelente para esa estrategia y casi siempre se debe usar la IMO.

+0

También es bueno tener un retraso aleatorio en lugar de uno fijo. – akond

+0

No veo mucho beneficio; lo que está pasando se va a volver claro para el cracker ya que el retraso promedio se incrementa, independientemente, pero no veo ningún daño tampoco si le atrae. – chaos

+0

@akond ¿Por qué es bueno tener un retraso aleatorio? – ChrisW

6

El primer problema que veo es que se trata de un bot al que no le importa si hay un retraso entre las respuestas. A menos que haga algo para limitar esto, está consumiendo recursos del sistema con retrasos potencialmente muy largos. Solo bloquee la IP después de 5 intentos fallidos. Puede ser una prohibición temporal si le preocupa prohibir un usuario real.

+0

Observación perspicaz sobre el enfoque de suspensión que no ofrece protección contra el atascamiento de los recursos del sistema. –

+0

Prohibir después de varios intentos fallidos. Añadiré eso también. – ganjan

+3

No estoy seguro de qué es lo que Friar tiene en mente, pero esto me lleva a una idea interesante. En lugar de dormir, ¿por qué no rechazar al usuario durante un período de crecimiento exponencial? Es decir, después de una falla, se rechazan todos los intentos de inicio de sesión desde esa IP dentro de, digamos, 1 segundo. Siguiente falla 2 segundos. Etc. Para un usuario humano que ha escrito mal la contraseña, probablemente ni siquiera se dará cuenta: le tomará más de un par de segundos verificar su contraseña y volver a escribirla. Pero para el robot, obtendrá fallas que probablemente no sepa cómo interpretarlas. – Jay

1

Es posible que desee aumentar ese tiempo de forma exponencial en lugar de solo de forma lineal; o arreglarlo, p. negar durante una hora después de 5 intentos fallidos.

4

Limite los intentos por IP y use un CAPTCHA. No sobrecargues tu servidor, piensa KISS.

+1

Sí, use reCaptcha o algo así, puede hacer que aparezca después de x intentos fallidos. – Phoenix

+0

No me gusta usar CAPTCHA, especialmente reCaptcha. Mal para el diseño, malo para la facilidad de uso. – ganjan

0

Sé que he visto esto hecho en alguna parte, aunque no recuerdo dónde. El ejemplo que vi duplicó el tiempo de retraso con cada intento fallido. Si comenzó con, digamos, .1 segundos, un usuario normal que podría confundir su contraseña una o dos veces obtiene un retraso de .4 segundos. Ellos ni siquiera se darán cuenta. Pero alguien que intente atacar con fuerza bruta rápidamente obtendrá demoras en minutos u horas.

Supongo que para una aplicación web puede haber un problema de lanzar un ataque de denegación de servicio en usted mismo. Todo depende de cómo maneje el sistema los retrasos de tiempo.

0

Bots realmente no se preocupan por su retraso, ya sea exponencial o logarítmico o algo así. Cualquier demora que use puede ser superada mediante sondeo. Entonces, no pienses en demora. Piense en limitar la cantidad de intentos y use Google reCAPTCHA. Utiliza el cifrado de clave pública y privada. Funciona para eliminar la mayoría de los bots y es más difícil de descifrar.

4

Debería tratar de no utilizar Sleep() porque utiliza ciclos de CPU, y si tiene un ataque de fuerza bruta desde 10,000 direcciones IP, ahorrará 10.000 procesos (o) hijos sleep(), esto causará carga en su servidor .

En su lugar, intente bloquear la dirección IP utilizando PHP. Algo como esto.

function block_ip($ip) { 
     $deny = array("$ip"); 
       if (in_array ($_SERVER['REMOTE_ADDR'], $deny)) { 
        header("HTTP/1.1 403 Forbidden"); 
        exit(); 
       } 
      } 
Cuestiones relacionadas