Regressão: novo limite de taxa do check_username pode bloquear o fluxo normal de cadastro

Desde a recente alteração no PR #43042, o endpoint /u/check_username.json está limitado a 10 requisições por minuto por IP.

Isso parece causar uma regressão no fluxo normal de registro.

Ao criar uma nova conta, o Discourse verifica automaticamente a disponibilidade do nome de usuário. O usuário não precisa enviar o formulário repetidamente para atingir esse limite. Simplesmente inserir um endereço de e-mail e um nome de usuário, pausar enquanto digita, alterar o nome de usuário ou corrigi-lo pode resultar em múltiplas requisições a /u/check_username.json.

Quando o limite é atingido, o formulário de registro exibe:

Você executou esta ação muitas vezes, por favor, tente novamente mais tarde.

O erro é exibido diretamente abaixo do campo de nome de usuário e efetivamente impede o usuário de continuar até que o limitador de taxa expire.

Não há indicação de quanto tempo o usuário deve esperar, e, do ponto de vista do usuário, parece que o nome de usuário escolhido ou o formulário de registro está quebrado.

Passos para reproduzir

  1. Abra o formulário de registro como usuário anônimo.
  2. Insira um endereço de e-mail válido.
  3. Insira e modifique o nome de usuário várias vezes, permitindo que a verificação de disponibilidade do nome de usuário seja executada entre as alterações.
  4. Continue até que /u/check_username.json tenha sido chamado mais de 10 vezes em um minuto.
  5. O campo de nome de usuário começa a exibir o erro do limitador de taxa:
    Você executou esta ação muitas vezes, por favor, tente novamente mais tarde.

Comportamento esperado

Um usuário normal que esteja completando ou corrigindo o formulário de registro não deve ser bloqueado por um limite de taxa interno acionado por verificações automáticas de disponibilidade de nome de usuário.

Se o limitador de taxa for necessário para prevenção de abuso, a experiência de usuário normal de registro deve degradar graciosamente, em vez de expor um erro de limite de taxa e impedir a criação da conta.

Comportamento real

O usuário recebe um erro de validação inline no campo de nome de usuário e não pode continuar normalmente até que o limite de taxa expire.

Alteração relevante

Isso parece ter sido introduzido por:

PR #43042 – DEV: Rate limit check_username requests per IP

A implementação atual usa:

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

A própria interface de usuário de registro pode gerar múltiplas verificações de nome de usuário, portanto, um limite de 10 requisições por minuto pode ser atingido durante interações legítimas.

Isso pode ser ainda mais problemático para usuários atrás de NAT compartilhado ou endereços IP públicos, já que o limitador é por IP e não por sessão.

Observação adicional

check_email também tem um limitador de 10 requisições/minuto/IP, mas quando esse limite é excedido, ele retorna uma resposta bem-sucedida em vez de exibir o erro de limite de taxa para o usuário.

Portanto, pode fazer sentido que check_username se comporte de forma semelhante, ou alternativamente:

  • aumentar o limite;

  • torná-lo configurável;

  • evitar contar requisições de sugestão de nome de usuário/validação automática no mesmo balde;

  • ou lidar com o limitador de taxa no lado do cliente sem bloquear o fluxo de registro.

    Posso reproduzir isso em uma instalação atual do Discourse, incluindo https://try.discourse.org/ após a alteração do PR #43042.

1 curtida