Pular para o conteúdo
Todos os conceitos

Homógrafos e punycode

Letras de alfabetos diferentes podem ter o mesmo desenho. Por baixo, um nome com letra fora do ASCII vira um endereço que começa com xn--.

Olhe estes dois endereços:

bancosesmaria.test
bаncosesmaria.test

Na tela são iguais. Mas o а do segundo é a letra a do alfabeto cirílico (usado no russo), não o a latino. Para o computador, cada letra é um número (um ponto de código Unicode), e esses dois são números diferentes: o a latino é U+0061, que em UTF-8 ocupa 1 byte (61); o а cirílico é U+0430, que ocupa 2 bytes (d0 b0). Endereço com letras de mesmo desenho e código diferente se chama homógrafo.

O DNS só conhece letras ASCII, algarismos e hífen. Para um nome com qualquer outro caractere funcionar, o navegador converte cada parte (rótulo) que tem caractere estranho para punycode: o prefixo xn--, as letras ASCII do rótulo na ordem, um hífen e um código que diz qual caractere entra em qual posição.

bаncosesmaria.test  ->  xn--bncosesmaria-x9j.test

O bncosesmaria são as letras ASCII que sobraram (o а impostor saiu), e o x9j guarda o U+0430 e a posição dele. O .test não muda, porque só tem ASCII.

original imitação b a n c o s e s m a r i a b а n c o s e s m a r i a código UTF-8 a latino U+0061 61 a cirílico U+0430 d0 b0 bаncosesmaria.test xn-- bncosesmaria -x9j .test prefixo letras ASCII qual letra e onde o DNS só aceita ASCII
Um a cirílico tem o mesmo desenho do latino, mas outro código e outros bytes; por isso o rótulo vira punycode, com xn-- na frente.

Para achar a letra impostora num texto: grep -P '[^\x00-\x7F]' mostra as linhas com caractere fora do ASCII, xxd mostra os bytes, e em Python unicodedata.name(c) diz o nome de cada caractere e host.encode("idna") faz a conversão (no Node, url.domainToASCII(host)). Muitos navegadores mostram a forma xn-- na barra de endereço quando um rótulo mistura alfabetos, justamente para proteger quem olha.

Nem todo endereço parecido é homógrafo. rn no lugar de m, l no lugar de I, 0 no lugar de o, uma letra a mais ou um hífen são truques com letras ASCII comuns, e não viram xn--. Contra todos eles a defesa é a mesma: não chegue a um site pelo link de uma mensagem. Digite o endereço ou use um favorito salvo.

Aparece nestes desafios