Régression : la nouvelle limite de fréquence de check_username peut bloquer le processus d'inscription normal

Depuis le récent changement apporté par la PR #43042, l’endpoint /u/check_username.json est soumis à une limitation de débit de 10 requêtes par minute par adresse IP.

Cela semble provoquer une régression dans le processus d’inscription normal.

Lors de la création d’un nouveau compte, Discourse vérifie automatiquement la disponibilité du nom d’utilisateur. Un utilisateur n’a pas besoin de soumettre le formulaire à plusieurs reprises pour atteindre cette limite. Il suffit de saisir une adresse e-mail et un nom d’utilisateur, de faire une pause en tapant, de modifier le nom d’utilisateur ou de le corriger pour générer plusieurs requêtes vers /u/check_username.json.

Une fois la limite atteinte, le formulaire d’inscription affiche :

Vous avez effectué cette action trop de fois, veuillez réessayer plus tard.

L’erreur est affichée directement sous le champ du nom d’utilisateur et bloque efficacement l’utilisateur dans sa progression jusqu’à l’expiration du limiteur de débit.

Il n’y a aucune indication sur la durée d’attente requise, et du point de vue de l’utilisateur, cela donne l’impression que le nom d’utilisateur choisi ou le formulaire d’inscription est défectueux.

Étapes pour reproduire le problème

  1. Ouvrir le formulaire d’inscription en tant qu’utilisateur anonyme.
  2. Saisir une adresse e-mail valide.
  3. Saisir et modifier le nom d’utilisateur plusieurs fois, en laissant le temps à la vérification de disponibilité de s’exécuter entre chaque modification.
  4. Continuer jusqu’à ce que /u/check_username.json ait été appelé plus de 10 fois en une minute.
  5. Le champ du nom d’utilisateur commence à afficher l’erreur de limitation de débit :
    Vous avez effectué cette action trop de fois, veuillez réessayer plus tard.

Comportement attendu

Un utilisateur normal complétant ou corrigeant le formulaire d’inscription ne devrait pas être bloqué par une limite de débit interne déclenchée par des vérifications automatiques de disponibilité du nom d’utilisateur.

Si une limitation de débit est nécessaire pour prévenir les abus, l’expérience utilisateur lors de l’inscription devrait se dégrader de manière progressive plutôt que d’afficher une erreur de limitation de débit et d’empêcher la création du compte.

Comportement actuel

L’utilisateur reçoit une erreur de validation en ligne dans le champ du nom d’utilisateur et ne peut pas continuer normalement jusqu’à l’expiration de la limite de débit.

Changement pertinent

Cela semble avoir été introduit par :

PR #43042 – DEV : Limiter le débit des requêtes check_username par IP

L’implémentation actuelle utilise :

RateLimiter.new(
  current_user,
  "check-username-#{request.remote_ip}",
  10,
  1.minute
).performed!

L’interface d’inscription elle-même peut générer plusieurs vérifications de nom d’utilisateur, de sorte qu’une limite de 10 requêtes par minute peut être atteinte lors d’une interaction légitime.

Cela peut même être plus problématique pour les utilisateurs derrière une adresse IP publique ou NAT partagée, car le limiteur est appliqué par IP plutôt que par session.

Observation supplémentaire

check_email est également soumis à une limite de 10 requêtes/minute/IP, mais lorsque cette limite est dépassée, il renvoie une réponse réussie au lieu d’afficher l’erreur de limitation de débit à l’utilisateur.

Il pourrait donc être judicieux que check_username se comporte de manière similaire, ou alternativement :

  • augmenter la limite ;

  • la rendre configurable ;

  • éviter de compter les requêtes de suggestion de nom d’utilisateur ou de validation automatique dans le même groupe ;

  • ou gérer la limitation de débit côté client sans bloquer le processus d’inscription.

    Je peux reproduire ce problème sur une installation Discourse actuelle, y compris sur https://try.discourse.org/ après le changement apporté par la PR #43042.

1 « J'aime »