Seit der letzten Änderung in PR #43042 ist /u/check_username.json auf 10 Anfragen pro Minute pro IP-Adresse begrenzt.
Dies scheint eine Regression im normalen Registrierungsprozess zu verursachen.
Beim Erstellen eines neuen Kontos prüft Discourse automatisch, ob der Benutzername verfügbar ist. Ein Benutzer muss das Formular nicht wiederholt absenden, um dieses Limit zu erreichen. Allein das Eingeben einer E-Mail-Adresse und eines Benutzernamens, das Pausieren während des Tippens, das Ändern des Benutzernamens oder dessen Korrektur kann zu mehreren Anfragen an /u/check_username.json führen.
Sobald das Limit erreicht ist, zeigt das Registrierungsformular an:
Du hast diese Aktion zu oft ausgeführt. Bitte versuche es später erneut.
Der Fehler wird direkt unter dem Benutzernamenfeld angezeigt und blockiert den Benutzer effektiv daran fortzufahren, bis der Rate-Limiter abläuft.
Es gibt keine Angabe, wie lange der Benutzer warten sollte, und aus Benutzersicht sieht es so aus, als wäre der gewählte Benutzername oder das Registrierungsformular defekt.
Schritte zur Reproduktion
- Öffne das Registrierungsformular als anonymes Mitglied.
- Gib eine gültige E-Mail-Adresse ein.
- Gib den Benutzernamen mehrmals ein und ändere ihn dabei, sodass die Verfügbarkeitsprüfung zwischen den Änderungen ausgeführt wird.
- Fahre fort, bis
/u/check_username.jsoninnerhalb einer Minute mehr als 10 Mal aufgerufen wurde. - Das Benutzernamenfeld beginnt, den Rate-Limiter-Fehler anzuzeigen:
Du hast diese Aktion zu oft ausgeführt. Bitte versuche es später erneut.
Erwartetes Verhalten
Ein normaler Benutzer, der das Registrierungsformular ausfüllt oder korrigiert, sollte nicht durch ein internes Rate-Limit blockiert werden, das durch automatische Verfügbarkeitsprüfungen des Benutzernamens ausgelöst wird.
Wenn Rate-Limiting zur Missbrauchsvorbeugung erforderlich ist, sollte die normale Benutzererfahrung bei der Registrierung sich sanft verschlechtern (graceful degradation), anstatt einen Rate-Limit-Fehler anzuzeigen und die Kontoerstellung zu verhindern.
Tatsächliches Verhalten
Der Benutzer erhält einen Inline-Validierungsfehler im Benutzernamenfeld und kann nicht normal fortfahren, bis das Rate-Limit abläuft.
Relevante Änderung
Dies scheint eingeführt worden zu sein durch:
PR #43042 – DEV: Rate limit check_username requests per IP
Die aktuelle Implementierung verwendet:
RateLimiter.new(
current_user,
"check-username-#{request.remote_ip}",
10,
1.minute
).performed!
Die Registrierungs-Benutzeroberfläche selbst kann mehrere Benutzernamenprüfungen auslösen, sodass ein Limit von 10 Anfragen pro Minute bei legitimer Interaktion erreicht werden kann.
Dies kann für Benutzer hinter geteilten NAT-/öffentlichen IP-Adressen sogar noch problematischer sein, da der Limiter pro IP und nicht pro Sitzung angewendet wird.
Zusätzliche Beobachtung
check_email hat ebenfalls einen Limiter von 10 Anfragen/Minute/IP, aber wenn dieses Limit überschritten wird, wird eine erfolgreiche Antwort zurückgegeben, anstatt den Rate-Limit-Fehler dem Benutzer anzuzeigen.
Es könnte daher sinnvoll sein, dass check_username ähnlich verhält, oder alternativ:
-
das Limit erhöhen;
-
es konfigurierbar machen;
-
Benutzernamensvorschläge/automatische Validierungsanfragen nicht in derselben Bucket zählen;
-
oder das Rate-Limiting clientseitig handhaben, ohne den Registrierungsprozess zu blockieren.
Ich kann dies in einer aktuellen Discourse-Installation reproduzieren, einschließlich https://try.discourse.org/ nach der Änderung aus PR #43042.
