Il problema è che questo aiuta solo se un account particolare viene attaccato. Ma invece di provare 100 password su un account, un utente malintenzionato potrebbe anche provare una password comune su 100 account. Per evitare ciò, è inoltre necessario monitorare il numero totale di accessi non riusciti e iniziare a visualizzare CAPTCHA quando il numero diventa eccezionalmente alto.
Per facilità d'uso, gli accessi falliti dovrebbero scadere automaticamente dopo un po '. Non ha senso mantenere il contatore per più di, diciamo, 24 ore.
Ultimo ma non meno importante, fai attenzione con le condizioni di gara quando lo realizzi. Molte persone verificano prima il numero di accessi non riusciti e quindi incrementano il contatore se necessario. Ma ciò consente a un utente malintenzionato di inviare un numero arbitrario di richieste simultanee tra il controllo e l'incremento e ogni volta che il server continuerà a "vedere" il vecchio contatore. È necessaria una singola query in cui si incrementa il contatore e si ottiene il nuovo valore allo stesso tempo, quindi è necessario verificare tale valore. Diversi sistemi di database hanno diverse tecniche per questo. In PostgreSQL, puoi utilizzare una query UPDATE
con una clausola RETURNING
. In MySQL, puoi usare una query UPDATE
con l'espressione di incremento avvolta in LAST_INSERT_ID()
e quindi ottenere il valore incrementato con SELECT LAST_INSERT_ID()
. Tieni presente che non puoi effettuare una semplice query SELECT
dopo l'aggiornamento, perché il contatore potrebbe già essere aumentato nel frattempo.