Prevenire gli accessi alla forza bruta sui siti web

In risposta ai recenti dirottamenti di Twitter e al post di Jeff su Dictionary Attacks , qual è il modo migliore per proteggere il tuo sito web dagli attacchi di accesso brute force?

Il post di Jeff suggerisce di aumentare il ritardo per ogni tentativo di accesso e un suggerimento nei commenti è di aggiungere un captcha dopo il secondo tentativo fallito.

Entrambe queste sembrano buone idee, ma come fai a sapere qual è il “numero di tentativi”? Non è ansible fare affidamento su un ID di sessione (perché un utente malintenzionato potrebbe cambiarlo ogni volta) o su un indirizzo IP (meglio, ma vulnerabile alle botnet). La semplice registrazione con il nome utente potrebbe, usando il metodo delay, bloccare un utente legittimo (o almeno rendere il processo di login molto lento per loro).

Pensieri? Suggerimenti?