Intentos fallidos de login

1,039 views
Skip to first unread message

Juan Rodríguez Monti

unread,
Aug 9, 2010, 8:15:18 AM8/9/10
to php...@googlegroups.com
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 ?.
- Sugieren utilizar sleep()  ?
- 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 ?

Vuestras respuestas son bienvenidas.

Slds.,
Juan

Jonathan Muszkat

unread,
Aug 9, 2010, 8:28:19 AM8/9/10
to php...@googlegroups.com

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.





2010/8/9 Juan Rodríguez Monti <juanrodri...@gmail.com>
utilizar



--
Jonathan Ariel Muszkat
Mail/Gtalk: mus...@gmail.com
Móvil: (011)15-4-399-6363
Linkedin: http://www.linkedin.com/in/musky
Twitter: @jonymusky
Blog: http://www.jonymusky.com.ar

Skype: jony.musky


Juan Rodríguez Monti

unread,
Aug 9, 2010, 8:39:05 AM8/9/10
to php...@googlegroups.com
El 9 de agosto de 2010 09:28, Jonathan Muszkat <mus...@gmail.com> escribió:

Dicho sistema esta en PHP?

Usualmente las preguntas a una lista de PHP son sobre, mirá-que-casualidad!, PHP. Así que si, está en PHP, increiblemente.
 

Porque si dices de utilizar sleep() se me hace que mucha idea de programación cliente/servidor no tenes.


Y en que te basás ? :) . Además, ¿ aporta algo a lo que yo pregunto tu apreciación basada-en-nada sobre mi ?, je.

Te hago una cita[0] de alguien que sí entiende algo del tema:

"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.


Pero no me respondas con algo que yo mismo planteo. Yo busco una solución mejor y que me guste más. Si con mi solución ( la planteo en el ítem tres de mi Email ) lo tenia resuelto, no me hubiera puesto a escribir un mail.

Se me hace que mucha idea de programación cliente/servidor no tenes si para responderme utilizás algo que yo mismo planteo en mi mail con la duda. (?)


Espero haberte ayudado,

Saludos.


Jonathan Muszkat

unread,
Aug 9, 2010, 8:59:13 AM8/9/10
to php...@googlegroups.com

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.




2010/8/9 Juan Rodríguez Monti <juanrodri...@gmail.com>

--
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.

Sebastian Choren

unread,
Aug 9, 2010, 9:11:23 AM8/9/10
to php...@googlegroups.com
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.

Espero que te sirva

saludos


Sebastián Choren

LinkedIn http://ar.linkedin.com/in/sebastianchoren
Twitter http://twitter.com/nerohc
FaceBook http://www.facebook.com/nerohc

http://www.callateborracho.com


2010/8/9 Jonathan Muszkat <mus...@gmail.com>

Mariano Garcia Berrotarán

unread,
Aug 9, 2010, 9:12:16 AM8/9/10
to php...@googlegroups.com
2010/8/9 Juan Rodríguez Monti <juanrodri...@gmail.com>:

> - Qué forma de implementar ésto sugieren o han utilizado antes ?.

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.

Mariano Iglesias

unread,
Aug 9, 2010, 9:13:38 AM8/9/10
to php...@googlegroups.com
Estoy de acuerdo con Jonathan (aunque no con su tono), en cuanto a que sleep no es la forma. Pensa que cada request al servidor web empieza cuando el servidor web recibe la peticion, y termina cuando envia la respuesta al cliente. Por eso no hay un proceso que se quede ejecutando entre request y request, por lo que sleep no tiene sentido.

Hacela facil. Agrega los campos:
  • last_login_attempt: DATETIME
  • login_attempts: UNSIGNED INT
  • cant_login_until: DATETIME
Luego haces:

  • 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.

Luego, si login_attempts
--
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.

--
-MI
Coding Ninja @ CRICAVA Technologies
 
Blog: marianoiglesias.com.ar
Twitter: @mgiglesias

Juan Rodríguez Monti

unread,
Aug 9, 2010, 9:18:46 AM8/9/10
to php...@googlegroups.com
El 9 de agosto de 2010 10:11, Sebastian Choren <sebasti...@gmail.com> escribió:
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.

Hola Sebastián,
Bueno, tal cual. Es muy común que en una empresa se haga NAT, y ahi es un problema porque salís a Internet con la misma IP, mientras que adentro quizás haya 100 máquinas o n máquinas. Y sí, ahí se afectaría a todos los usuarios.

Como ventaja, es posible prohibir el acceso únicamente cuando la combinación sea ip & nombredeusuario. En ese caso, uno de los identificadores sí es único.
 

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.

Sí.

Te agradezco la información técnica que me has dado, ha sido útil para resolver el problema.

Saludos,
Juan 

Sebastian Choren

unread,
Aug 9, 2010, 9:21:12 AM8/9/10
to php...@googlegroups.com
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.
2010/8/9 Mariano Garcia Berrotarán <garcia.b...@gmail.com>

Juan Rodríguez Monti

unread,
Aug 9, 2010, 9:28:27 AM8/9/10
to php...@googlegroups.com
El 9 de agosto de 2010 10:21, Sebastian Choren <sebasti...@gmail.com> escribió:
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.

Tal cual, yo no usaria sesión. Lo pensé primero, pero luego de indagar un poco me dí cuenta que no era seguro.

Slds.,
Juan

Mariano Garcia Berrotarán

unread,
Aug 9, 2010, 9:32:53 AM8/9/10
to php...@googlegroups.com
El 9 de agosto de 2010 10:21, Sebastian Choren <sebasti...@gmail.com>
escribió:
>
> Che, pero no es muy seguro usar session. Si te deshabilitan las cookies no
> te anda mas la session.

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

Darío Nasta

unread,
Aug 9, 2010, 9:34:32 AM8/9/10
to php...@googlegroups.com
Hola

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.

Facundo Ruiz

unread,
Aug 9, 2010, 7:31:12 PM8/9/10
to Grupo PHP Argentina
Yo optaría por la ultima... registrar el usuario, cuando exista un
logeo fallido en un determinado tiempo claro esta y comparando la ip
de conexión...

este script te devuelve la ip del cliente...
function getRealIpAddr() {
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip=$_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}else{
$ip=$_SERVER['REMOTE_ADDR'];
}
return $ip;
}

Juan Rodríguez Monti

unread,
Aug 10, 2010, 9:10:46 AM8/10/10
to php...@googlegroups.com
El 9 de agosto de 2010 10:13, Mariano Iglesias <mariano....@cricava.com> escribió:

Hacela facil. Agrega los campos:
  • last_login_attempt: DATETIME
  • login_attempts: UNSIGNED INT
  • cant_login_until: DATETIME
Luego haces:

  • 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.
Listo!, muchas gracias Mariano. Esta fué la solución que más me gustó y la que terminé implementando. Yo habia pensado de otra forma, inspirado en algo que surgió en StackOverflow, pero me gustó mucho más esta forma.

Saludos,
Juan

Pelah

unread,
Aug 11, 2010, 1:58:00 PM8/11/10
to Grupo PHP Argentina
Yo te recomiendo lo siguiente:

Guardar en una tabla la cantidad de intentos
Cuando llegas al limite, borras el password de la base y le mandas un
mail al usuario explicandole el asunto
El mail tiene un link para generar la nueva clave

Claro que un usuario sin clave no puede loguearse (siempre revisar del
lado del servidor)

Esto claro si tenes el mail del usuario, sino, esperar cada vez mas
entre intentos de login esta bien

On 9 ago, 09:15, Juan Rodríguez Monti <juanrodriguezmo...@gmail.com>
wrote:

Almudena Soblechero García

unread,
Apr 9, 2015, 1:27:39 PM4/9/15
to php...@googlegroups.com, javie...@gmail.com
Buenas buscando información acerca de este tema, os he encontrado, aunque la respuestas veo que son del año 2010, voy a intentar haceros la misma pregunta.

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....

Yo

unread,
Apr 16, 2015, 10:35:18 AM4/16/15
to php...@googlegroups.com, javie...@gmail.com
El jueves, 9 de abril de 2015, 14:27:39 (UTC-3), Almudena Soblechero García escribió:
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?

Es mejor crear otra tabla para registrar los intentos de login. Si lo miras del lado de nomalización de  las bases de datos sería lo correcto manejarlo en otra tabla.
Bloquear automaticamente la cuenta no es buena solución. Un agente malintencionado puede bloquear el uso de tu sistema solo con realizar intentos de login. Podrías crear una lista negra y una blanca de IPs.
Correos/Alertas al administrador si, eso es recomendable.

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....

 No se que tipo de sistema/pagina estas haciendo, pero obligar a usar navegadores que acepten cookies es algo común.
Reply all
Reply to author
Forward
0 new messages