Por que a Sanitização de Nome de Usuário do Webhook do Discord Remove Unicode Específico
🔍 WiseChecker

Por que a Sanitização de Nome de Usuário do Webhook do Discord Remove Unicode Específico

Ao enviar uma mensagem via webhook do Discord, você pode notar que certos caracteres Unicode no campo de nome de usuário são removidos ou substituídos silenciosamente. Isso acontece mesmo quando os mesmos caracteres funcionam normalmente em um nome de usuário comum do Discord ou de bot. O sintoma é um nome de usuário que parece incompleto ou com lacunas inesperadas. A causa é a sanitização do lado do servidor do Discord, que remove caracteres considerados inseguros ou incompatíveis com suas regras de validação de nome de usuário. Este artigo explica exatamente quais caracteres Unicode são removidos, por que o Discord aplica essa filtragem e como contornar a limitação sem quebrar suas integrações de webhook.

Principais Conclusões: Filtragem de Unicode em Nomes de Usuário de Webhook do Discord

  • Caracteres de largura zero e controle (U+200B, U+200C, U+200D, U+FEFF): Sempre removidos por não terem glifo visível e poderem ser usados para falsificação ou texto oculto.
  • Pares substitutos e sequências UTF-8 inválidas: O Discord rejeita Unicode malformado que não esteja em conformidade com os padrões de codificação UTF-8, fazendo com que o nome de usuário inteiro seja rejeitado ou truncado.
  • Caracteres fora do Plano Multilíngue Básico (BMP) acima de U+FFFF: Emojis e scripts raros como Linear B podem ser removidos porque o campo de nome de usuário do webhook aceita apenas caracteres do BMP.

ADVERTISEMENT

Como o Discord Sanitiza Nomes de Usuário de Webhook

O Discord aplica um processo de filtragem em dois estágios para nomes de usuário de webhook. O primeiro estágio ocorre no lado do cliente ou na camada da API antes que o payload do webhook seja enviado aos servidores do Discord. O segundo estágio acontece no lado do servidor quando o Discord processa a mensagem. O filtro do servidor é mais rigoroso que o do cliente.

O campo de nome de usuário em um payload de webhook é uma string com comprimento máximo de 80 caracteres. A documentação da API do Discord afirma que os nomes de usuário devem conter apenas caracteres UTF-8 válidos. Mas na prática, a implementação do Discord vai além, removendo caracteres que poderiam causar problemas de renderização, explorações de segurança ou problemas de compatibilidade entre diferentes plataformas e dispositivos.

Caracteres Que São Sempre Removidos

O Discord remove as seguintes categorias de caracteres Unicode dos nomes de usuário de webhook:

  • Caracteres de largura zero: U+200B (espaço de largura zero), U+200C (não separador de largura zero), U+200D (separador de largura zero), U+FEFF (marca de ordem de byte / espaço sem quebra de largura zero). Esses caracteres não têm representação visível e são removidos para evitar texto oculto ou falsificação.
  • Caracteres de controle: U+0000 a U+001F e U+007F a U+009F. Isso inclui tabulação, retorno de carro e outros códigos não imprimíveis. O Discord os remove para evitar interrupções na formatação da mensagem ou na renderização do cliente.
  • Metades substitutas: U+D800 a U+DFFF. São inválidas em UTF-8 e nunca estão presentes em uma string codificada corretamente. Se enviadas, o Discord rejeita toda a solicitação do webhook com um erro 400.
  • Caracteres não BMP: Caracteres acima de U+FFFF, incluindo a maioria dos emojis e scripts raros. O campo de nome de usuário do webhook do Discord é limitado ao Plano Multilíngue Básico. Enviar emojis como 😀 (U+1F600) resulta na remoção do emoji ou no truncamento do nome de usuário.

Por Que o Discord Aplica Essas Restrições

A sanitização do Discord existe para evitar vários problemas reais. Caracteres de largura zero podem ser usados para inserir texto oculto que aparece como espaços normais, permitindo personificação ou desvio de filtros de palavras. Caracteres de controle podem travar ou confundir clientes que não os tratam adequadamente. Caracteres não BMP, como emojis, causam inconsistências de renderização entre dispositivos e plataformas, especialmente em lugares como a lista de membros ou mensagens diretas, onde o nome de usuário é exibido em fonte pequena.

A sanitização também é uma medida de segurança. Sequências UTF-8 malformadas podem desencadear estouros de buffer ou ataques de injeção em versões mais antigas do cliente. Ao filtrar agressivamente o campo de nome de usuário, o Discord reduz a superfície de ataque para integrações de webhook, que são frequentemente usadas por serviços de terceiros que podem não validar a entrada adequadamente.

Passos para Testar Quais Caracteres São Removidos

  1. Crie um webhook de teste em um canal privado
    Vá em Configurações do Servidor > Integrações > Webhooks. Clique em Novo Webhook, dê um nome e copie a URL do webhook. Use um canal onde apenas você possa ver as mensagens para evitar spam para outros.
  2. Envie um webhook com um caractere problemático conhecido
    Use uma ferramenta como curl, Postman ou um script Python simples para fazer POST na URL do webhook. Defina o campo username no payload JSON para uma string que inclua um espaço de largura zero (U+200B) ou um emoji (U+1F600). Exemplo de payload: {"username": "Test\u200BUser", "content": "Verificando sanitização"}
  3. Inspecione o nome de usuário resultante no Discord
    Olhe a mensagem no canal. Se o caractere foi removido, o nome de usuário aparecerá como “TestUser” sem nenhuma lacuna visível. Se o caractere causou uma rejeição, você verá um erro 400 Bad Request na sua resposta HTTP.
  4. Repita com outros caracteres
    Teste cada categoria: caracteres de controle (U+000A para nova linha), metades substitutas (U+D800) e caracteres não BMP (U+1F600). Registre os resultados para confirmar quais são removidos versus quais causam uma rejeição completa.

ADVERTISEMENT

Se o Discord Ainda Remover Caracteres Após o Teste

Nome de Usuário do Webhook Aparece Truncado Após Emoji

Se você incluir um emoji no nome de usuário, o Discord pode removê-lo e também truncar o restante do nome após esse ponto. Isso acontece porque o sanitizador do Discord processa a string da esquerda para a direita e para quando encontra um caractere não BMP. A solução é colocar emojis apenas no final do nome de usuário ou evitá-los completamente. Use alternativas baseadas em texto como :smile: no campo de conteúdo.

Solicitação de Webhook Retorna 400 Bad Request

Um erro 400 significa que o payload contém UTF-8 inválido ou uma metade substituta. Verifique sua codificação. Certifique-se de que o payload JSON está codificado em UTF-8 e que a string de nome de usuário não contém substitutos isolados. Desenvolvedores Python devem usar json.dumps() com ensure_ascii=False para preservar caracteres Unicode corretamente. Se você estiver construindo o JSON manualmente, valide-o com uma ferramenta como JSONLint antes de enviar.

Nome de Usuário Aparece em Branco Após Sanitização

Se todos os caracteres do seu nome de usuário forem removidos pelo filtro do Discord, o webhook usará o nome padrão “Webhook” ou o nome salvo do webhook nas configurações do servidor. Para evitar isso, inclua sempre pelo menos um caractere ASCII visível (uma letra, número ou pontuação) no nome de usuário. Por exemplo, use “BotName” em vez de uma string de espaços de largura zero.

Categoria de Caractere Exemplo de Code Point Comportamento do Discord
Espaço de largura zero U+200B Removido silenciosamente
Caractere de controle (tab) U+0009 Removido silenciosamente
Metade substituta U+D800 Rejeita toda a solicitação com erro 400
Emoji (não BMP) U+1F600 Removido silenciosamente, pode truncar caracteres subsequentes
Letra latina A U+0041 Permitido sem modificação

A sanitização de nomes de usuário de webhook do Discord é uma escolha de design deliberada que prioriza segurança e compatibilidade em vez de flexibilidade. Entender exatamente quais caracteres são removidos ajuda a construir integrações de webhook que funcionam de forma confiável em todos os clientes e plataformas. A abordagem mais segura é limitar os nomes de usuário de webhook a letras ASCII, números e pontuação comum. Se precisar de caracteres especiais, coloque-os no final da string e teste com sua versão específica do cliente Discord. Para casos de uso avançados, como nomes de usuário dinâmicos de sistemas externos, considere usar o sistema de comandos de aplicativo do Discord, que suporta uma gama maior de caracteres Unicode em nomes de exibição.

ADVERTISEMENT