Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Contar Logins fallidos en los ultimos 5 minutos desde una IP

Estas en el tema de Contar Logins fallidos en los ultimos 5 minutos desde una IP en el foro de Mysql en Foros del Web. Buenas, Tengo un formulario de acceso (login y pass) y todos los intentos los registro en la BD. Me gustaría poder hacer como aquí en ...
  #1 (permalink)  
Antiguo 06/10/2013, 04:43
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Contar Logins fallidos en los ultimos 5 minutos desde una IP

Buenas,

Tengo un formulario de acceso (login y pass) y todos los intentos los registro en la BD. Me gustaría poder hacer como aquí en forosdelweb que si superas 5 intentos fallidos seguidos te bloqueé durante 5 minutos.

Mi tabla accesos consta de una PK autoincremental, el user_login, la fecha, la IP y un boleano que dice si el login fue correcto o no.

Entiendo que me haría falta una consulta a esta tabla que agrupase todos los intentos fallidos desde la IP X y detectase si en los últimos 5 minutos hubieron más de 5. Pero no sé como jugar con la fecha para detectar que hubieron X accesos en los últimos 5 minutos desde la IP X.

Se os ocurre alguna manera?

Muchas gracias de antemano!
  #2 (permalink)  
Antiguo 06/10/2013, 05:03
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Contar Logins fallidos en los ultimos 5 minutos desde una IP

Podrías buscar los intentos fallidos dentro de los últimos 5 minutos, simplemente buscas en el rango horario entre 5 minutos antes de la fecha-hora actual y la fecha-hora actual del servidor los intentos fallidos de ese usuario. No he puesto los INNER JOIN, pero la lógica general sería esta. Pero eso solo deberías hacerlo si el intento es fallido (guardando la fechahoradelfallo y la IP) lanzas de inmediato otra consulta:
Código MySQL:
Ver original
  1. SELECT IP, COUNT(*) totalfallidos
  2.  WHERE IP = @IP
  3.     AND fallido = 'sí'
  4.     AND fecha BETWEEN  DATE_SUB (@fechahoradelfallo, 5 MINUTES) AND NOW()

Última edición por jurena; 06/10/2013 a las 05:19
  #3 (permalink)  
Antiguo 06/10/2013, 06:17
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Contar Logins fallidos en los ultimos 5 minutos desde una IP

Si ejecuto este ejemplo me da el siguiente error

Código MySQL:
Ver original
  1. SELECT ip, COUNT(*) totalfallidos from tabla_accesos
  2.      WHERE ip = '127.0.0.1'
  3.         AND fallido = 0
  4.         AND fecha BETWEEN DATE_SUB ('2013-10-06 14:14:18', 5 MINUTES) AND NOW()
  5.      GROUP BY ip

Incorrect parameters in the call to stored function 'DATE_SUB'

Y si le quito el DATE_SUB

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'MINUTES) AND NOW()
GROUP BY ip' at line 4

Última edición por gnzsoloyo; 06/10/2013 a las 14:42 Razón: REsaltar con highlights, por favor.
  #4 (permalink)  
Antiguo 06/10/2013, 12:58
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Contar Logins fallidos en los ultimos 5 minutos desde una IP

Perdona, quita la S de MINUTES.
Código MySQL:
Ver original
  1. SELECT IP, COUNT(*) totalfallidos
  2.  WHERE IP = @IP
  3.     AND fallido = 'sí'
  4.     AND fecha BETWEEN  DATE_SUB (@fechahoradelfallo, 5 MINUTE) AND NOW()
  #5 (permalink)  
Antiguo 06/10/2013, 14:57
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Contar Logins fallidos en los ultimos 5 minutos desde una IP

Buenas,

Me seguía dando el mismo error tuve que hacerlo así con el INTERVAL

AND fecha BETWEEN DATE_SUB('2013-10-06 22:52:00', INTERVAL 5 MINUTE) AND NOW()

Pero no acabo de ver bien como funciona esta función.

Si desde la IP X.X.X.X hay los siguientes intentos

2013-10-06 22:45:10
2013-10-06 22:45:20
2013-10-06 22:45:30
2013-10-06 22:45:40
2013-10-06 22:45:50
2013-10-06 22:46:10

Y la hora actual son las 22:50:00
Y se intenta acceder nuevamente el valor del campo sería así, no?

AND fecha BETWEEN DATE_SUB('2013-10-06 22:50:00', INTERVAL 5 MINUTE) AND NOW()

Esto me diría que desde las 22:50:00 (hora actual) hasta hace 5 minutos los intentos que la IP X.X.X.X ha realizado. Es decir de 22:45:00 hasta 22:50:00 son 6 intentos

Es correcto?

Si me espero hasta las 22:51:00 , le quito 5 minutos son 22:46:00 por tanto ahora me diría que solo hay 1 intento fallido en los últimos 5 minutos no?

Muchas gracias
  #6 (permalink)  
Antiguo 07/10/2013, 00:34
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Contar Logins fallidos en los ultimos 5 minutos desde una IP

Así es Neodani. Por cierto, perdona la ausencia de INTERVAL, lo hice bien en la prueba, pero me olvidé de incorporarlo. Tal vez es eso lo que quieres, pero lo mismo deseas penalizar desde el momento en que acumulas 5 intentos fallidos. En ese caso tendrías que añadir una tabla de retrasos en la que guardarías la fecha-hora a que retrasas cada IP con 5 intentos fallidos. Cada IP tendría un registro solamente como máximo, salvo que quieras guardar un histórico. Al acumular el 5º intento, guardas la fecha de referencia de 5 minutos posterior a esa. Luego solo le das acceso si entra en un momento posterior a esa fecha, y si no le avisas de que tiene que esperar hasta esa hora. Pero, como te dije, es posible que siga intentando...

Etiquetas: ip, minutos, registro, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:24.