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.