2011-11-05 67 views
5

Me han asignado una tarea en la que necesito crear un captcha para iniciar sesión en una sección de "comentarios".Seguimiento de intentos de inicio de sesión utilizando cookies PHP

Tengo el captcha funcionando bien, no hay problema. También tenemos la tarea de llevar la cuenta de los intentos fallidos en el captcha. No hay problema.

Aquí está mi problema. Se nos dice que el usuario puede intentar tantas veces como lo desee, sin embargo, si fallan 5 veces dentro de un límite de treinta segundos, se bloquean durante tres minutos.

Entiendo cómo rastrear 5 intentos fallidos, pero ¿cómo harías un seguimiento de los tiempos en este? Si el usuario intentó 4 veces en 15 segundos, y luego esperó durante un minuto (o menos, obviamente), el reloj se reinicia y tienen 5 intentos más. Además, si lo intentaran dos veces y esperaran 30 segundos, los intentos volverían a intentarlo.

¿Necesito establecer una cookie de tiempo, una cookie de conteo secundario (para ir junto con la cookie de recuento original), y rastrear el inicio del contador secundario y simplemente ver si ese contador se incrementa a 5? ¿Cómo harías esto?

EDIT:

que disculparme, al parecer, no estaba del todo claro en mi situación. En esta tarea, está estrictamente estipulado que debemos usar cookies para realizar esta tarea. No estamos buscando las mejores prácticas o seguridad en este punto, el instructor simplemente quiere que nos sintamos cómodos con las cookies. Desafortunadamente, la sesión no es una opción para mí, debo usar cookies.

+5

Realizando comprobaciones de seguridad del lado del cliente = error ... – Amber

Respuesta

3

Dado que ha etiquetado esto como PHP, simplemente inicie una sesión con session_start(). Esto le da a cada usuario una ID única a través de una cookie, y puede almacenar sus intentos de inicio de sesión en la matriz $_SESSION en el servidor. En cada intento de inicio de sesión, puede verificar los intentos grabados almacenados en la sesión y ver si exceden la tasa de intento permitida.

Por supuesto, las advertencias habituales son válidas: en un sistema de seguridad real, es muy poco probable que un atacante mantenga esa cookie de sesión en sus múltiples intentos, la ignorarían y obligarían a crear una nueva sesión en blanco cada vez. .

+0

Deberíamos enseñar mejores prácticas aquí, ¿no? Dado que el cliente puede restablecer esa sesión volcando sus cookies, esta no es una buena idea en absoluto. – Brad

+1

Que es exactamente lo que señalo en el segundo párrafo ... –

+0

Veo eso. Sin embargo, no me sorprendería que alguien viniera e implementara lo que ha sugerido, a pesar de su advertencia, simplemente porque es "más fácil". Oh, bueno, creo que ese es su problema. – Brad

2

¡No haría esto en las cookies! Los usuarios pueden eludir esto fácilmente, lo que hace que su sistema sea bastante inseguro.

Debe registrar cada intento de inicio de sesión en una base de datos. Luego, solo consulta los intentos realizados dentro del período de tiempo especificado cuando intentan iniciar sesión. Si ya lo han intentado con demasiada frecuencia, no los deje entrar.

2

Dado que esto es tarea, ¡no hay código para usted!

En un nivel alto, todo lo que necesita hacer es almacenar las marcas de tiempo en lugar del "conteo". Luego, en cada solicitud, puede tirar marcas de tiempo de más de 30 segundos y contar el resto.

0

Implementaré la especificación tal como está y no trataría de interpretarla. Aumentaría la complejidad del problema.

Para implementar, sugiero usar sesiones o registros del lado del servidor en lugar de manejar cookies hechas a mano. puede mantener el tiempo de cada intento de inicio de sesión para el usuario, antes de cada verificación de autenticación los últimos 5 intentos. si el primer valor de tiempo es inferior a treinta segundos, alerta al usuario y deshabilita el formulario de inicio de sesión durante 5 minutos. podría almacenar el tiempo de desbloqueo del formulario en la sesión del usuario (agregando los segundos de espera hasta el momento del último intento fallido), y así todas las solicitudes del formulario de inicio de sesión fallarían si el tiempo del servidor fuera menor que el desbloqueado hora.Cuando el formulario está desbloqueado, elimine la marca de tiempo de desbloqueo en la sesión del usuario y vuelva a habilitar el formulario.

1

El problema de proteger su sistema de un usuario malintencionado debe manejarse en el lado del servidor. Podría usar una combinación de IP y nombre de usuario que intente iniciar sesión para crear un identificador único para esa persona. Si esa combinación de credenciales intenta forzar un inicio de sesión, bloquee a esa persona durante 5 minutos.

0

Me gustaría registrar cada intento fallido como una matriz en la sesión.

Aquí hay algunos códigos y pseudocódigos.

<? 
// Check if they are locked out. 
if ($_SESSION['lockedOutTime'] < (time() - (3*60))) { 

    // they are locked out; don't attempt login 

    // notify them that they are still locked out 



// If they aren't locked out, allow them to attemp the login 
} else { 

    // Attempt login 
    // ... 

    // if failed... log it 
    $_SESSION['failedLoginAttempts'][] = time(); 

    $thirtySecondsAgo = time(); 
    $failedAttemptsInTheLastThirtySeconds = 0; 


    // count failed login attempts in the last 30 seconds 
    foreach ($_SESSION['failedLoginAttempts'] as $failedAttempTime) { 

     if ($failedAttempTime >= $thirtySecondsAgo) { 

      $failedAttemptsInTheLastThirtySeconds++; 

     } 

    } 

    // Check if they are over the limit 
    if ($failedAttemptsInTheLastThirtySeconds >= 5) { 

     // lock em out 
     $_SESSION['lockedOutTime'] = time(); 

     // Notify user they have been locked out 
     // ... 

    } 



} 

?> 
Cuestiones relacionadas