Impostazione di un limite per i tentativi di recupero della password

7

in un'impostazione in cui uno ha dimenticato la propria password, mi piacerebbe poter limitare i tentativi di inserire indirizzi email a qualcosa tipo 10. Il mio primo pensiero è stato quello di usare un cookie.

$attempts = 0;

if( isset( $_COOKIE['password_recovery_attempts'] ) ) 
  $attempts = $_COOKIE['password_recovery_attempts'];

if( $pass === false ){
  $val = $attempts + 1;
  setcookie( 'password_recovery_attempts', $val, time() + 86400 ); //86400 = 1 day
}

if( $attempts > 9 ){
  echo 'You have attempted to reset your password too many times';
  return false;
}

La mia preoccupazione riguardo all'utilizzo di un cookie è che i cookie possono essere facilmente rimossi. Quale sarebbe una pratica migliore qui?

    
posta Tony 13.03.2013 - 02:59
fonte

3 risposte

11

Hai ragione che un cookie è una cattiva idea, ma l'approccio in sé è fuorviante.

Il problema con questo tipo di limiti è che rendono facile per un utente malintenzionato creare una condizione DoS per l'utente legittimo, semplicemente inserendo 10 indirizzi email errati. Anche se ritardi i tentativi, l'utente malintenzionato può semplicemente inviare una richiesta ogni volta che scade il limite di tempo.

Il modo in cui lo implementerei sarebbe la limitazione temporale delle richieste su base IP, per account, senza ritardi dopo il primo e il secondo tentativo, ma aumentando i ritardi su tentativi consecutivi fino a un limite di 45 secondi. Un'altra misura utile sarebbe quella di applicare 45 secondi ritardi su qualsiasi richiesta proveniente da un indirizzo IP che ha visto più di 10 tentativi errati negli ultimi 15 minuti su un numero qualsiasi di account, al fine di proteggersi dagli attacchi che eseguono la scansione dell'intero elenco di nomi utente contro un unico indirizzo email conosciuto. Potrei anche considerare di richiedere un CAPTCHA dopo un certo numero di tentativi falliti, per proteggere dagli attacchi automatici.

Questo offre i seguenti vantaggi:

  • Un client legittimo sarà sempre in grado di utilizzare la funzionalità (ovvero non è possibile raggiungere alcuna condizione DoS) a condizione che l'utente malintenzionato stia utilizzando un indirizzo IP diverso pubblicamente.
  • È possibile eseguire un numero ragionevole di tentativi non riusciti senza che l'utente venga ostacolato dai meccanismi di blocco.
  • Sia gli attacchi mirati che gli attacchi di frutta a bassa quota sono ostacolati con effetti negativi minimi sugli utenti legittimi.
  • Lo scenario peggiore è che un utente malintenzionato generi una condizione DoS sulla stessa rete di un utente legittimo. Non esattamente critico o probabile.

Ciò implicherebbe la memorizzazione di tentativi falliti in un registro sul lato server, forse in una tabella di database o in cache in memoria.

    
risposta data 13.03.2013 - 04:20
fonte
1

Non puoi mai fidarti del cliente, e l'utilizzo di un cookie è proprio questo: ti affidi al client (possibilmente un utente malintenzionato) che ti invia informazioni accurate. Affinché funzioni correttamente, è necessario memorizzare questo lato server.

È possibile memorizzare il conteggio tentativi di ripristino con i dati dell'account e ripristinarlo su 0 all'accesso riuscito - fattibile per siti più piccoli. Per i siti più grandi, è necessario archiviare i dati in un archivio dati separato, memcached o simile (probabilmente utilizzando qualsiasi meccanismo utilizzato per i dati delle sessioni lato server).

    
risposta data 13.03.2013 - 04:13
fonte
1

Devi bloccare il lato del server dell'account. L'impostazione di un cookie o il blocco temporaneo di un IP possono essere tutti evitati dal cliente. Suggerirei di utilizzare un meccanismo per disabilitare l'utente dal ripristino dopo% tentativi falliti dix. Lo script PHP dovrebbe controllare il tuo database se i tentativi superano x .

    
risposta data 13.03.2013 - 04:22
fonte

Leggi altre domande sui tag