Es ist immer die Frage, wovor genau du dich schützen willst (gezielter Angriff? Scriptkiddies? Bots? Rachsüchtiger Ex-User? Rachsüchtichtiger Ex-Mitarbeiter? Kennt der Angreifer Benutzername und rät nur das Kennwort? Oder rät er beides? Welche Ressourcen hat er?), wie wahrscheinlich das Eintreten ist und was der Impact der Sicherheitsmaßnahmen für die anderen Nutzer ist.
Am Ende wird es sowieso eine Kombination verschiedener Möglichkeiten; was zum Arsenal IMHO noch gehört:
Account Flaggen
Stillen Alarm auslösen
Account zeitweise oder dauerhaft sperren
Anwendung komplett sperren
Teergrube
Aber wie gesagt: Was du wann wie einsetzt richtet sich nach dem Angriffsszenario (wer, wie, usw.).
Interessante Ansätze, jedoch nicht so einfach umzusetzen.
Beispiel: Ein Bot befindet sich hinter eine Uni IP. Nun benutzen 2000 Studenten die Seite. Wenn ich den Bot nun ausschließe für sagen wir mal 10 Stunden, dann können die anderen Studenten sich kein PW zurückschicken lassen
Accounts flaggen / temp block halte ich für sinnvoll. Sprich mehr als 5 falsche Logins auf einer UserID -> Accountblock für 15 Minuten. Zusätzlich halt Cookie / Session lock bei mehr als 5 falschen Logins, unabhängig von der ID. Hält zumindest die wannabes vom Hals. Bei übermäßigem LoginTraffic von einer IP muss halt in den Captcha Apfel gebissen werden.
Das ist für den Login, aber dein Titel lässt vermuten, dass du die Passwort vergessen funktion sicher schreiben willst. Da sollte ein (gutes) Captcha + account als pw requested flaggen reichen.
Und dann nimmst noch die Teergrube (aka Honeypot) dazu.
Bei der Teergrube handelt es sich um einen trick um Bots zu detecten. Bots sind in der Regel so angelegt, dass Sie alle Felder ausfüllen (auch die Unsichtbaren e.G. hidden fields). Genau da platziert man die Teergrube oder den Honeypot. Du legst ein inputfeld an und setzt das html attribut auf hidden, dann checkst du im validator ob dieses Feld ausgefüllt wurde, falls ja handelt es sich wahrscheinlich um einen Bot.