In un'applicazione web, un modo per proteggersi dagli attacchi di indovinare la password è bloccare gli account dopo un determinato numero di accessi non riusciti. Questo potrebbe essere fatto sia sull'indirizzo IP sia sul nome utente di origine.
Ad esempio, la seguente tabella mostra cosa succede quando vengono rilevati tentativi ripetuti. Il sistema è impostato per bloccare gli account dopo 3 accessi non riusciti in una finestra di 5 minuti, per 5 minuti.
IP Time Username Creds Correct? Message Given
203.0.113.1 10:00:00 [email protected] N Bad username or password
203.0.113.1 10:00:01 [email protected] N Bad username or password
203.0.113.1 10:00:02 [email protected] N Bad username or password
203.0.113.2 10:00:03 [email protected] N Bad username or password
203.0.113.1 10:00:04 [email protected] N Login locked from your location
203.0.113.2 10:00:05 [email protected] Y Welcome!
203.0.113.2 10:00:06 [email protected] N Account locked
203.0.113.2 10:00:07 [email protected] Y Welcome!
203.0.113.1 10:01:00 [email protected] Y Login locked from your location
203.0.113.1 10:05:03 [email protected] Y Welcome!
I tentativi di accesso vengono conteggiati solo quando le credenziali vengono convalidate (il processo deve verificare il blocco prima di convalidare le credenziali - se bloccato, quindi le credenziali non sono convalidate).
Come puoi vedere dai seguenti, un utente malintenzionato (con IP 203.0.113.3
) può bloccare un account che causa un Denial of Service indovinando ripetutamente la password sbagliata di proposito:
IP Time Username Creds Correct? Message Given
203.0.113.3 10:06:00 [email protected] N Bad username or password
203.0.113.3 10:06:01 [email protected] N Bad username or password
203.0.113.3 10:06:02 [email protected] N Bad username or password
203.0.113.3 10:06:03 [email protected] N Account locked
203.0.113.10 10:07:00 [email protected] Y Account locked
203.0.113.10 10:07:04 [email protected] Y Account locked
203.0.113.10 10:07:08 [email protected] Y Account locked
203.0.113.10 10:07:15 [email protected] Y Account locked
203.0.113.10 10:07:25 [email protected] Y Account locked
... impedendo al vero utente di 203.0.113.10
di accedere.
Un'alternativa a questo è ritardare artificialmente la risposta HTTP. Pronuncia i primi ritardi di accesso non riusciti di 1 secondo, il secondo di 2 secondi, il terzo di 4 e così via fino a un totale di 16 secondi. Se il loro account viene attaccato, l'utente vedrà un cerchio che gira nel proprio browser mentre attendono la risposta HTTP alla loro richiesta di accesso.
Ci sono degli svantaggi? Quanto sopra sarebbe ora il seguente (diciamo che c'è un ritardo di 1 secondo come predefinito, a causa delle iterazioni di bcrypt):
IP Req Time Resp Time Username Creds Correct? Message Given
203.0.113.3 10:06:00 10:06:01 [email protected] N Bad username or password
203.0.113.3 10:06:01 10:06:03 [email protected] N Bad username or password
203.0.113.3 10:06:03 10:06:08 [email protected] N Bad username or password
203.0.113.3 10:06:08 10:06:17 [email protected] N Bad username or password
203.0.113.10 10:06:18 10:06:35 [email protected] Y Welcome!
Si noti che il ritardo artificiale (quando attivo) avviene attraverso i thread, il che significa che l'attaccante non può inviare richieste da un singolo IP a una velocità maggiore. Un accesso da un IP diverso non viene accodato, sebbene possa ancora verificarsi un ritardo artificiale generato da tentativi errati sul nome utente.
Come puoi vedere, l'accesso a 203.0.113.10
non viene negato all'accesso - devono semplicemente attendere 17 secondi per completare il login, mentre l'attaccante deve ritardare il loro attacco. Pertanto è efficace nel prevenire gli attacchi indovinatori di password.
La mia domanda è quali sono gli aspetti negativi di questo approccio e perché non vedi questo tipo di approccio più spesso piuttosto che il blocco totale che può causare il rifiuto del servizio per gli utenti?