Dicho sistema esta en PHP?
Porque si dices de utilizar sleep() se me hace que mucha idea de programación
cliente/servidor no tenes.
Lo más fácil que haría seria una tabla donde tenes datetime o timestamp, ip,
usuario.
Entonces al ser un intento fallido haces un INSERT en esa
tabla y te fijas al momento de loguearse si tiene intentos fallidos si tiene
> X impedis que haga el SELECT para comprobar identidad.
Espero haberte ayudado,
Saludos.
Dicho sistema esta en PHP?
Porque si dices de utilizar sleep() se me hace que mucha idea de programación cliente/servidor no tenes.
"a good start would be to just sleep(1); after a failed login attempt - easy to implement, almost bug-free.
1 second isn't much for a human (especially because login attempts by humans don't fail to often), but 1sec/try brute-force ... sloooow! dictionary attacks may be another problem, but it's in the same domain."
Lo más fácil que haría seria una tabla donde tenes datetime o timestamp, ip, usuario.Entonces al ser un intento fallido haces un INSERT en esa tabla y te fijas al momento de loguearse si tiene intentos fallidos si tiene > X impedis que haga el SELECT para comprobar identidad.
Espero haberte ayudado,
Saludos.
Insisto que
por la forma de funcionar de PHP no podrias utilizar un sleep() para solucionar
tu problema.
El porque de esta premisa es bastante extenso, ahora bien si me muestras un
ejemplo valido de que me estoy equivocando te apuesto a que puedo burlarlo.
Disculpa si te ofendí, no es mi intención.
--
Has recibido este mensaje porque estás suscrito al grupo "Grupo PHP Argentina" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a php...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a php-arg+u...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/php-arg?hl=es.
Yo implementé algo similar con una variable de sesión y un contador.
por cada intento fallido, le ponia un sleep(2) y si el contador supera
x intentos, tiro un die y un error 500. como la sesión expira despues
de X tiempo, ni siquiera tengo que hacer cálculos.
Aunque guardar todos los intentos fallidos es una buena idea,
sobretodo para hacer un buen tracking de quien está tratando de entrar
al sistema.
--
Has recibido este mensaje porque estás suscrito al grupo "Grupo PHP Argentina" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a php...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a php-arg+u...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/php-arg?hl=es.
| Coding Ninja @ CRICAVA Technologies | |
| Blog: | marianoiglesias.com.ar |
| Twitter: | @mgiglesias |
Lo que quiere decir el amigo aca es que cuando pones un sleep() gastas recursos innecesariamente. El usuario va a ver que tarda 5 minutos en terminar de cargar la pagina, con lo cual probablemente trate de refrescar la pagina, y ya te esta rompiendo el esquema, porque vas a registrar mas logins fallidos.
lo de loguear la IP en db esta relativamente bien, pero por ejemplo, que pasa si estan tratando de entrar desde una oficina de 100 personas? estan atras de un router o un proxy, asique salen los 100 con la misma IP, asique si baneas a uno estas baneando a toda la oficina.
Si es para una intranet, no tenes ese problema.
Igual tenes funciones que te devuelven la ip real del cliente. aca te dejo una
http://roshanbh.com.np/2007/12/getting-real-ip-address-in-php.html
A mi por lo menos no se me ocurre otro metodo para hacer esto. No podes usar cookies, no podes usar sesion. Creo que la unica solucion que tenes es lo de la ip real.
Che, pero no es muy seguro usar session. Si te deshabilitan las cookies no te anda mas la session.
O un robot, al no tener cookies, no levanta session. Asique te puede tranquilamente hacer un ataque por fuerza bruta.
Podés controlar eso, dependiendo el método de propagación. la sesión
no siempre está atada a la cookie.
Esto también está interesante para leer:
http://www.owasp.org/index.php/Blocking_Brute_Force_Attacks
El 09/08/2010 09:15 a.m., Juan Rodr�guez Monti escribi�:
> Buenas lista,
> Estoy trabajando con un sistema que hace un cierto tipo de login
> contra una base de datos.
>
> Estaba viendo qu� medida de protecci�n implementar ante los intentos
> de logueo fallidos. Pens� en diferenciar entre unos pocos intentos
> fallidos, en donde podria ser una medida de "castigo" leve, tipo
> prohibir el acceso por 5 minutos, y ya si se pasa de un cierto n�mero
> hacer un ban de esa ip & usuario por un rato largo.
>
> Las preguntas:
>
> - Qu� forma de implementar �sto sugieren o han utilizado antes ?.
Hay muchos, personalmente me gusta registrar la hora en una tabla junto
con la ip y alg�n otro dato que distinga al usuario (que puede cambiar
de navegador)
> - Sugieren utilizar sleep() ?
No!!! Un sleep te deja durmiendo un thread (una copia) del servidor
> - La mejor manera de implementar �sto les parece que es grabando la
> informaci�n en la base de datos y luego comparando contra la base de
> datos si hubo intentos fallidos, qu� ip los hizo, etc ?
Es lo mejor
>
> Vuestras respuestas son bienvenidas.
>
> Slds.,
> Juan
> --
> Has recibido este mensaje porque est�s suscrito al grupo "Grupo PHP
> Argentina" de Grupos de Google.
> Para publicar una entrada en este grupo, env�a un correo electr�nico a
> php...@googlegroups.com.
> Para anular tu suscripci�n a este grupo, env�a un correo electr�nico a
> php-arg+u...@googlegroups.com
> Para tener acceso a m�s opciones, visita el grupo en
> http://groups.google.com/group/php-arg?hl=es.
Hacela facil. Agrega los campos:
Luego haces:
- last_login_attempt: DATETIME
- login_attempts: UNSIGNED INT
- cant_login_until: DATETIME
- Si cant_login_until > NOW(), rechaza el intento de login, y sali de esta logica
- Si cant_login_until < NOW(), actualiza cant_login_until a NULL
- Si el login es correcto, actualiza: last_login_attempt = NULL, cant_login_until=NULL, login_attempts=0
- En cambio, y si el login es fallido, hace login_attempts++ y actualiza last_login_attempt a NOW().
- Si login_attempts > MAXIMO_NUMERO_DE_LOGIN_ATTEMPTS, entonces actualiza cant_login_until a NOW() + 5 minutos.
Si desde una base de datos de usuarios ya creada, sería bueno, agregar un campo en el que, se incluyan números de intentos, y en el caso de que se cumplan el número de intentos, mandar un correo electrónico al email del usuario para que pueda resetear la clave? o bien, bloquearle la cuenta al usuario, y que se mande automáticamente un correo al administrador para que informe el usuario y se le resete la cuenta?
La opción de las cookies no me gusta en exceso, porque no todos los navegadores soportan este tipo de cosas y además habría que agregar permisos en el servidor....