Punycode em nomes de domínio internacionalizados

Punycode é um protocolo de codificação padronizado, que transforma cadeias de caracteres Unicode em cadeias de caracteres ASCII. Isso permite que nomes de domínio internacionalizados (IDNs) contenham caracteres não ASCII, como tremas.

Desenvolvimento do protocolo de codificação Punycode

O protocolo do Punycode foi padronizado em 2003 pela IETF (Internet Engineering Task Force), como a sintaxe a ser aplicada na codificação de IDNs (Nomes de Domínio Internacionalizados). É importante esclarecer que a IETF define IDNs como nomes de domínio que contêm caracteres não latinos, como tremas ou outros símbolos usados por alguns idiomas estrangeiros. Estes são incompatíveis com protocolos básicos, como os do Sistema de Nomes de Domínio (DNS), não podendo, assim, serem processados.

Um nome de domínio alemão, como müller-büromöbel, pode ser registrado sob o domínio nacional de nível superior (ccTLD) .de, desde a liberação de IDNs. Entretanto, este domínio precisa passar por um processo de codificação para ir à resolução de nomes. Como grande parte dos protocolos da internet são baseados no idioma inglês, eles só suportam conjuntos limitados de caracteres ASCII.

Para garantir que IDNs sejam compatíveis também com padrões mais antigos da internet, o IETF estipulou que nomes de domínio internacionalizados devem ser codificados utilizando somente esses caracteres limitados. Para padronizar a codificação, um protocolo nomeado de Punycode foi criado.

Nota

Para endereços de e-mail, o Punycode é aplicado somente a domínios de e-mail internacionalizados. Já a parte local (antes do @) é codificada por UTF-8 quando contém caracteres não ASCII.

Como funciona a codificação Punycode?

Resumo do protocolo Punycode

O protocolo Punycode, definido pelo IETF, pode ser encontrado em RFC 3492. Ele define como aplicar um algoritmo de codificação geral, boostring, que permite que strings de conjuntos de caracteres arbitrários sejam mapeadas exclusivamente por uma seleção definida de elementos. Na codificação Punycode, estes elementos são chamados decaracteres base e compostos de letras minúsculas, dígitos e hifens (-).

O desenvolvimento do protocolo de codificação Punycode foi baseado em seis princípios:

  • Completude: Cada string de saída pode ser mapeada como string simplificada por bootstring.
  • Exclusividade: A atribuição da string de saída à respectiva codificação bootstring é exclusiva. A cada Punycode é atribuída exatamente uma contraparte ASCII, e vice-versa.
  • Reversibilidade: A codificação da string inicial pode ser revertida a qualquer momento, sem que haja qualquer perda de informação.
  • Eficiência: A cadeia codificada pode ser, se necessário, minimamente mais longa que a cadeia original.
  • Simplicidade: O bootstring utiliza algoritmos simples de codificação e decodificação.
  • Legibilidade: Somente caracteres que não podem ser representados pelo conjunto de caracteres básicos são codificados. Todos os outros permanecem inalterados.

O Punycode especifica o bootstring a ser usado, levando em conta os requisitos para nomes de domínio internacionalizados. Assim, o mapeamento de caracteres Unicode se sobrepõe ao de caracteres básicos (e permitidos).

Exemplo

Observe o seguinte exemplo de codificação Punycode:

IDN: müller-büromöbel

O nome de domínio internacionalizado müller-büromöbel contém dois caracteres, ü e ö, que não são atualmente permitidos para nomes de domínio. Assim sendo, eles devem ser codificados por Punycode para que passem a ser compatíveis.

Passo 1: Normalização

O primeiro passo do procedimento de codificação prevê a normalização da cadeia de caracteres inicial. Assim, todas as letras maiúsculas são substituídas pelas letras minúsculas correspondentes. Outros caracteres não básicos também passam por um processo de resolução.

Passo 2: Eliminação de todos os caracteres não básicos

Na segunda etapa, todos os caracteres não básicos são excluídos e adicionados ao nome de domínio em formato codificado, separados por um hífen.

Se o protocolo Punycode for usado para codificar endereços web, cada string de resultado será fornecida com o chamado prefixo ACE (abreviação de ASCII Compatible Encoding, ou Codificação Compatível com ASCII):

Prefixo ACE: xn–

O prefixo ACE garante que nomes de domínio que simplesmente contêm hifens não sejam interpretados erroneamente como nomes de domínio internacionalizados.

Assim, o IDN müller-büromöbel passará a ter a seguinte codificação:

ACE: xn–mller-brombel-rmb4fg

Interessante observar o algoritmo associado ao protocolo Punycode. Ele garante que, apesar da conversão, nenhum dos rótulos de domínio exceda o comprimento máximo de 63 caracteres.

Durante o processo de codificação, caracteres Unicode não são convertidos, um por um, em caracteres ASCII. Em vez disso, o algoritmo calcula a cadeia de caracteres baseando-se na distância entre os caracteres excluídos e a posição dos caracteres na cadeia de saída.

No nosso exemplo, a cadeia rmb4fg indica que mller-brombel deve ser complementado com os caracteres Unicode ü e ö na segunda e na sétima casa.

exemplo-de-codificacao-punycode.png
Uma string ACE é composta de um prefixo ACE e de uma string codificada por Punycode

Exceções

Domínios que não contém nenhum caractere básico, ou somente caracteres não básicos, são tratados de forma especial.

Um nome de domínio que só utiliza caracteres não básicos exibe apenas a cadeia de caracteres codificada e o prefixo ACE após o processo de codificação. O nome de domínio παράδειγμα (“exemplo” escrito em grego) passaria a ter a seguinte codificação:

IDN: παράδειγμα

ACE: xn–hxajbheg2az3al

Se um nome de domínio contiver apenas caracteres básicos, ele não passa por uma codificação Punycode e, por isso, não ganha um prefixo ACE. A codificação não é necessária neste caso, porque o nome de domínio já é compatível com os protocolos básicos da internet.

Se observarmos a integralidade do Nome de Domínio Totalmente Qualificado (FQDN), veremos que cada rótulo (domínio de nível superior, domínio de segundo nível, domínio de terceiro nível etc.) é codificado separadamente. O domínio fictício пример.бг (búlgaro para exemplo.bg) seria, portanto, codificado da seguinte forma:

IDN: пример.бг

ACE: xn–e1afmkfd.xn–90ae

A tabela abaixo exemplifica algumas variações do protocolo Punycode

IDN Punycode ACE
Caracteres básicos e não básicos müller-büromöbel.de mller-brombel-rmb4fg.de xn--mller-brombel-rmb4fg.de
Só caracteres não básicos Παράδειγμα.gr hxajbheg2az3al.gr xn--hxajbheg2az3al.gr
Só caracteres básicos exemplo.org exemplo.org Não é utilizado
Nota

O algoritmo associado ao Punycode é descrito, em detalhes, pelo documento RFC 3492. Além disso, ele exemplifica a implementação deste protocolo de codificação utilizando a linguagem de programação C.

A maioria das pessoas utiliza conversores de Punycode (Punycode converter) gratuitos ao codificar nomes de domínio internacionalizados.

Punycode para codificar domínios com emoji

Não apenas nomes de domínio internacionalizados, mas também domínios com emoji podem ser resolvidos pelo Punycode. Contudo, para que a conversão seja possível, o respectivo domínio de nível superior deve permitir o uso de emojis. Da mesma forma, o emoji desejado deve ter sido registrado também em padrão Unicode para funcionar.

Tecnicamente, domínios com emoji são processados pelo Punycode. Contudo, neste caso, o endereço web deve ser exibido combinando texto e emoji.

Emoji-Domain: https://i❤.ws/

ACE: https://xn--i-7iq.ws/

Atualmente, nenhum navegador padrão, como Firefox, Chrome, Safari, Edge e Opera, suporta a exibição de domínios com emoji. Caso você insira um deles na barra de endereços, este será exibido como sequência ACE.

Punycode converter gratuito

Você pode encontrar diversos Punycode converter na internet, que traduzem IDNs em representações compatíveis com ASCII gratuitamente.

O site Punycoder.com, por exemplo, converte nomes de domínio internacionalizados em cadeias de caracteres ASCII. Ainda, ele é capaz de fazer a conversão oposta, traduzindo cadeias ASCII em cadeias Unicode com facilidade.

punycoder-punycode-converter.png
O Punycoder resolve nomes IDNs em ASCII

Também recomendamos o Punycode converter by Mathias Bynens, que é baseado em punycode.js.

punycode-converter-baseado-em-js.png
Ferramenta de código aberto converte nomes de domínio internacionalizados

Quais são os riscos do Punycode?

O Punycode é especialmente vulnerável a ataques homográficos, um crime cibernético de phishing no qual hackers tiram proveito da semelhança entre caracteres para atrair vítimas desavisadas a sites falsos. O blogueiro Xudong Zheng mostra como aparenta um ataque de phishing que faz uso de um Punycode URL. O exemplo dele utiliza o Punycode URL https://www.xn--80ak6aa92e.com/, que leva usuários da internet a um site com o seguinte IDN: https://www.аррӏе.com/.

O problema é que o Punycode URL acima não corresponde ao site oficial da empresa estadunidense de tecnologia Apple Inc., mas a um site de phishing criado para fins de demonstração.

Em vez do caractere ASCII a (Unicode U+0061) o a cirílico é usado (U+0430). Difíceis de serem diferenciados a olho nu, eles são interpretados de maneira totalmente diferente pelos navegadores, o que é uma grande desvantagem do sistema. Certificados também não garantem a segurança, pois criminosos costumam emitir certificados SSL válidos para sites de phishing modernos, o que transmite ainda mais a impressão de legitimidade.

exemplo-de-ataque-homografico.png
Exemplo de domínio homográfico: o URL corresponde visualmente ao do site oficial da Apple, mas, na verdade, o caractere cirílico Unicode U+0430 é usado ao invés do caractere ASCII a. Ambos são incrivelmente parecidos.

Usuários do navegador Firefox podem se proteger deste tipo de ataque. Para reduzir o risco de phishing homográfico, impeça a tradução Punycode de IDNs. Siga estes dois passos:

  1. Acesse o editor de configuração: Digite about:config na barra de endereços do navegador para abrir o editor de configuração do Firefox.
  2. Altere o Punycode: Encontre a configuração network.IDN_show_punycode e modifique o valor de false para true.

Se você fizer isso, seu navegador Firefox passará a exibir domínios internacionalizados como cadeias de caracteres ACE na barra de endereços.

Este artigo foi útil?
Para melhorar a sua experiência, este site usa cookies. Ao acessar o nosso site, você concorda com nosso uso de cookies. Mais informações
Page top