Sto iniziando a pensare che non è così semplice come sembra, e molte risposte "accettate" qui e in SO hanno risposte alternative che li criticano. Ecco cosa ho raccolto finora
La maggior parte di ciò che ho raccolto proviene da questa domanda SO
Utilizzo di IP - non accurato
For ex. in countries like Singapore there are limited number of ISPs and a smaller set of IPs which are available for home users
Inoltre, penso che questo non sia efficace negli attacchi brute force distribuiti
Uso del cookie di sessione - facile da superare, non richiede molto tempo per cancellare un cookie e non è efficace negli attacchi di forza bruta distribuiti
L'utilizzo del nome utente - timeout esponenziale crescente - può avere soluzioni alternative
If I have a list of 1000 usernames, I'll try user1+password1, user2+pasword1, user3+password1... user1+password2, user2+password2
Utilizzo di ricapitolazione - buona, ma devi ancora sapere che è lo stesso "utente" (che può fare un attacco distribuito, cancellare i cookie, ecc.)
Quindi presumo che non esista una soluzione perfetta, ma esiste una soluzione "buona" approccata da qualsiasi organizzazione come OWASP per la gestione della limitazione dei tentativi di accesso falliti?