2011-11-05 14 views
5

Mi è stato assegnato un compito a casa in cui ho bisogno di creare un captcha per accedere a una sezione 'commenti'.Tracciamento dei tentativi di accesso utilizzando i cookie PHP

Ho il captcha che funziona bene, nessun problema. Abbiamo anche il compito di mantenere il conteggio dei tentativi falliti al captcha. Nessun problema.

Ecco il mio problema. Ci viene detto che l'utente può provare quante volte desidera, tuttavia, se falliscono 5 volte entro un limite di trenta secondi, vengono bloccati per tre minuti.

Capisco come rintracciare 5 tentativi mancati, ma come monitoreresti i tempi su questo? Se l'utente ha provato 4 volte in 15 secondi e poi ha aspettato un minuto (o meno, ovviamente), l'orologio viene resettato e hanno altri 5 tentativi. Inoltre, se avessero provato due volte e aspettato 30 secondi, i tentativi avrebbero provato di nuovo.

Devo impostare un cookie orario, un cookie di conteggio secondario (per accompagnare il cookie di conteggio originale) e tracciare l'inizio del contatore secondario e vedere se il contatore si incrementa a 5? come lo faresti?

EDIT:

devi scusarti, a quanto pare non ero del tutto chiara sulla mia situazione. In questo compito a casa, è strettamente stipulato che dobbiamo usare i cookie per portare a termine questo compito. A questo punto, non stiamo guardando alle migliori pratiche o alla sicurezza, l'istruttore vuole semplicemente che ci sentiamo a nostro agio con i cookie. Sfortunatamente, la sessione non è un'opzione per me, devo usare i cookie.

+5

Fare controlli di sicurezza lato client = errore ... – Amber

risposta

3

Dato che hai taggato come PHP, avvia semplicemente una sessione con session_start(). Ciò conferisce a ciascun utente un ID univoco tramite un cookie ed è possibile memorizzare i tentativi di accesso nell'array $_SESSION sul server. Ad ogni tentativo di accesso, è possibile verificare i tentativi registrati memorizzati nella sessione e verificare se superano la percentuale di tentativi consentiti.

Naturalmente, i soliti avvertimenti tengono: Su un vero e proprio sistema di sicurezza, un aggressore sarebbe altamente improbabile per mantenere il cookie di sessione sui loro molti tentativi - avevano ignorano, forzando una nuova sessione vuota da creare di volta in volta .

+0

Dovremmo insegnare le migliori pratiche qui, sì? Dato che il client può ripristinare quella sessione scaricando i loro cookie, questa non è affatto una buona idea. – Brad

+1

Che è esattamente quello che sottolineo nel secondo paragrafo ... –

+0

Lo vedo. Non sarei un po 'sorpreso nel vedere qualcuno arrivare e implementare ciò che hai suggerito, nonostante il tuo avviso, semplicemente perché è "più facile". Oh bene, immagino che questo sia il loro problema. – Brad

2

Non lo farei affatto nei cookie! Gli utenti possono aggirare questo facilmente, rendendo il sistema abbastanza insicuro.

È necessario registrare ogni tentativo di accesso in un database. Quindi, è sufficiente eseguire una query per i tentativi effettuati entro il periodo di tempo specificato quando tentano di accedere. Se hanno già provato troppo spesso, non lasciarli entrare.

2

Poiché questo è compito, nessun codice per te!

Ad un livello elevato, tutto ciò che dovete fare è memorizzare i timestamp invece del "conteggio". Quindi su ogni richiesta puoi gettare via data e ora più vecchi di 30 secondi e contare il resto.

0

Vorrei implementare la specifica così com'è e non proverei a interpretarla. Aumenterebbe la complessità del problema.

Per implementare suggerisco di utilizzare sessioni o registri lato server invece di gestire i cookie fatti a mano. è possibile mantenere i tempi di ciascun tentativo di accesso per l'utente, prima di ogni autenticazione controllare gli ultimi 5 tentativi. se il primo valore è inferiore a trenta secondi, avvisare l'utente e disabilitare il modulo di accesso per 5 minuti. è possibile memorizzare il tempo di sblocco del modulo nella sessione utente (aggiungendo i secondi di attesa all'ora dell'ultimo tentativo non riuscito), quindi ogni richiesta per il modulo di accesso sarebbe fallita se l'ora del server è inferiore allo sblocco tempo.Quando il modulo è sbloccato, rimuovi il timestamp di sblocco sulla sessione utente e riattiva il modulo.

1

Il problema di proteggere il sistema da un utente malintenzionato dovrebbe essere gestito lato server. È possibile utilizzare una combinazione di IP e nome utente che tentano di accedere per creare un identificativo univoco per quell'individuo. Se tale combinazione di credenziali tenta di forzare un accesso, blocca quell'individuo per 5 minuti.

0

Registrerei ogni tentativo non riuscito come matrice nella sessione.

Ecco un codice e uno pseudo-codice.

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

    } 



} 

?> 
Problemi correlati