Punycode: conversão de domínios internacionalizados
O Punycode é um método de codificação padronizado que codifica caracteres Unicode utilizando um conjunto limitado de caracteres ASCII. Graças a este método, é possível processar nomes de domínio internacionalizados (IDN), que podem conter caracteres não ASCII, como a letra «ñ».
Desenvolvimento do método de codificação
Em 2003, o Grupo de Trabalho de Engenharia da Internet (IETF, sigla em inglês para Internet Engineering Task Force) padronizou o Punycode como sintaxe para a codificação de nomes de domínio internacionalizados em aplicações (IDNA).
A IETF define como IDN os nomes de domínio que contêm caracteres especiais (como o acento circunflexo, a cedilha ou o til) ou letras que não fazem parte do alfabeto latino (um exemplo claro é o caso do «ñ»). Estes caracteres não ASCII impedem que protocolos básicos, como o Sistema de Nomes de Domínio (DNS), os consigam processar.
Assim, por exemplo, desde a introdução dos IDN, o nome de domínio azulejos-coruña é admitido no domínio de nível superior .es. No entanto, no âmbito da resolução de nomes, só poderia ser processado se fosse efetuada a codificação dos caracteres não básicos (no exemplo apresentado, o «ñ»). São numerosos os protocolos que utilizam a linguagem escrita em inglês e, por conseguinte, são compatíveis apenas com o conjunto limitado de caracteres ASCII.
Para garantir a compatibilidade dos IDN com os padrões mais antigos da Internet, a IETF definiu uma codificação para os nomes de domínio internacionalizados com os caracteres até então permitidos, ao mesmo tempo que padronizou o procedimento correspondente com o Punycode.
Como funciona a codificação Punycode?
Resumo do procedimento Punycode
A IETF estabelece na norma RFC 3492 que o Punycode é uma das possíveis aplicações de um algoritmo de codificação geral conhecido como Bootstring. O algoritmo Bootstring permite representar cadeias de caracteres com uma seleção limitada de elementos. Na codificação Punycode, estes elementos são denominados caracteres básicos e referem-se às letras minúsculas originais do alfabeto latino, aos algarismos e ao hífen (-). O desenvolvimento do procedimento de codificação baseia-se em seis princípios:
- Integridade: com o Bootstring, cada cadeia de saída pode ser representada por uma cadeia simplificada.
- Unicidade: a classificação da cadeia de saída e a sua codificação Bootstring são inequívocas. A cada Punycode pode ser atribuído exatamente um equivalente em ASCII e vice-versa.
- Reversibilidade: a codificação através do Bootstring pode ser revertida sem perda de informação.
- Eficiência: a cadeia de caracteres codificada excede apenas minimamente em comprimento (por vezes, nem sequer) a cadeia de saída.
- Simplicidade: o Bootstring utiliza algoritmos de codificação e descodificação simples.
- Legibilidade: apenas são codificados os caracteres que não podem ser representados no conjunto de caracteres de destino. Os restantes caracteres permanecem inalterados.
O Bootstrapping especifica o Punycode de acordo com os requisitos dos nomes de domínio internacionalizados. Isto deverá permitir representar caracteres Unicode utilizando os caracteres básicos permitidos até ao momento.
Exemplo
A seguir, apresentamos esta sintaxe com o exemplo a seguir:
IDN: azulejos-coruña
O domínio «azulejos-coruña» contém a letra «ñ», que não faz parte dos caracteres anteriormente permitidos para nomes de domínio e que, por isso, deve ser codificada através do Punycode para garantir a compatibilidade.
Passo 1. Normalização
Na primeira etapa, o processo de codificação prevê a normalização da cadeia de caracteres de saída (por exemplo, todas as letras maiúsculas são substituídas por minúsculas).
Passo 2. Eliminação dos caracteres não básicos
Na segunda etapa, todos os caracteres não ASCII são removidos, sendo substituídos no domínio pela sua forma codificada e separados por um hífen.
Ao codificar endereços de Internet com Punycode, cada cadeia resultante é acompanhada pelo prefixo ACE (abreviatura de ASCII Compatible Encoding):
Prefixo ACE: xn—
O prefixo ACE garante que os nomes de domínio que contêm hífens não sejam interpretados erroneamente como nomes de domínio internacionais.
Por fim, o resultado codificado para azulejos-coruña é o seguinte:
ACE: xn–azulejos-corua-2nb
É importante salientar que o algoritmo subjacente ao método Punycode garante que, apesar da conversão, nenhuma das categorias de domínio exceda os 63 caracteres.
No que diz respeito à codificação, é importante ter em conta que os caracteres Unicode não se traduzem, um a um, em caracteres ASCII. Em vez disso, o algoritmo determina uma sequência que resulta da distância entre os caracteres que foram eliminados e da posição que lhes corresponde na sequência de saída.
Voltando ao nosso exemplo, a sequência de caracteres 2nb indica que «corua» deve ser completada com o caractere Unicode «ñ» na quinta posição.

Casos especiais
Os desvios deste esquema ocorrem quando o nome de domínio contém apenas caracteres não ASCII ou não contém nenhum.
Um nome de domínio que contenha apenas caracteres não básicos apresentará, após o processo de codificação, o prefixo ACE juntamente com uma cadeia de caracteres totalmente codificada.
Assim, por exemplo, a um nome de domínio como «παράδειγμα» (em grego, «exemplo») corresponde a seguinte codificação:
IDN: exemplo
ACE: xn–hxajbheg2az3al
Por outro lado, quando um nome de domínio é composto exclusivamente por caracteres ASCII, não se recorre ao procedimento Punycode. Por conseguinte, também não se adiciona um prefixo ACE. A codificação não é necessária neste caso, uma vez que os protocolos básicos da Internet compreendem o nome de domínio sem qualquer problema.
No caso do nome de domínio totalmente qualificado ( FQDN , do inglês Fully Qualified Domain Name), cada uma das suas categorias (domínio de nível superior, domínio de segundo nível, domínio de terceiro nível, etc.) deve ser codificada separadamente.
Um domínio como пример.бг (em búlgaro, «exemplo.bg») poderia ser codificado da seguinte forma:
IDN: пример.bg
ACE: xn–e1afmkfd.xn–90ae
A tabela seguinte apresenta um resumo das diferentes variantes do procedimento Punycode.
| IDN | Punycode | ACE | |
|---|---|---|---|
| Caracteres ASCII e não ASCII | azulejos-coruña.es | azulejos-corua-2nb.es | xn–azulejos-corua-2nb.es |
| Apenas caracteres não ASCII | Παράδειγμα.gr | hxajbheg2az3al.gr | xn–hxajbheg2az3al.gr |
| Apenas caracteres ASCII | exemplo.org | exemplo.org- | Não se aplica |
O RFC 3492 descreve em pormenor o algoritmo subjacente ao Punycode. O documento também fornece uma implementação do procedimento de codificação na linguagem de programação C.
Para a codificação de nomes de domínio internacionalizados, os utilizadores costumam recorrer a conversores Punycode gratuitos.
Punycode em domínios com emojis
Não só os nomes de domínio internacionalizados, mas também os domínios com emojis podem ser codificados com Punycode. Como requisito, é necessário que o domínio de nível superior permita a sua utilização e que o emoji que se pretende usar esteja registado na norma Unicode.
Atualmente, os TLD a seguir permitem o registo de domínios com emojis: .ws, .tk, .to, .ml, .ga, .cf, .gq e .fm.
Do ponto de vista técnico, os domínios com emojis são processados como Punycode, embora, em teoria, sejam apresentados ao utilizador como uma combinação de texto e emojis.
Domínio com emoji: https://i❤.ws/
ACE: https://xn--i-7iq.ws/
No entanto, atualmente, praticamente nenhum navegador padrão implementa este modelo de domínio. Se introduzir um domínio com emojis no Firefox, Chrome, Safari, Edge ou Opera, a barra de endereços mostra apenas a sequência ACE.
Conversores Punycode gratuitos
Existem vários sites que oferecem conversores Punycode gratuitos para converter os IDN em representações compatíveis com ASCII.
No que diz respeito ao espaço de nomes com domínios de nível superior .es ou .mx, podemos citar, por exemplo, o conversor de domínios do site Cyberneticos. Esta ferramenta destaca-se pela sua capacidade de codificar caracteres não ASCII tão característicos da língua espanhola como o «ñ», as tremas ou os acentos, bem como caracteres pouco comuns de outras línguas.

Outro conversor digno de destaque é o Punycode Converter, de Mathias Bynens, baseado no punycode.js. Tal como a ferramenta acima referida, este conversor pode ser utilizado para a codificação de IDN em espanhol, mas também noutras línguas.

O Punycode representa um risco para a segurança?
O Punycode representa um risco para a segurança no que diz respeito aos ataques homográficos, um tipo de phishing em que os criminosos imitam a aparência de diferentes caracteres para atrair utilizadores desavisados para sites falsos.
Para que os utilizadores compreendam este tipo de ataque de phishing, o blogueiro Xudong Zheng apresenta um exemplo na sua página utilizando o seguinte domínio Punycode:
https://www.xn--80ak6aa92e.com/
Que redireciona os utilizadores para uma página com o seguinte IDN:
https://www.аррӏе.com/
No entanto, este URL não corresponde ao site oficial da empresa de tecnologia da Califórnia, a Apple Inc., mas sim a uma página de phishing criada apenas a título de exemplo.
Em vez do caractere ASCII «a» com o código Unicode U+0061, utiliza-se o caractere cirílico «a» (U+0430). Embora, à primeira vista, seja muito difícil distinguir estes dois caracteres, os navegadores interpretam-nos como caracteres diferentes.
Além disso, o facto de nem mesmo os certificados garantirem segurança constitui uma grande desvantagem para os utilizadores. Nas campanhas de phishing modernas, os criminosos utilizam certificados SSL válidos, o que confere ao site criado uma aparência de segurança e profissionalismo.
Para evitar este tipo de ataques, as versões atuais do Chrome e do Opera apresentam a sequência ACE em vez do domínio internacionalizado. O Internet Explorer e o Microsoft Edge impedem completamente o acesso a este tipo de domínios. O Firefox é o único navegador que não oferece proteção contra o phishing Punycode.

Se é utilizador do Firefox, pode reduzir o risco de ataques de phishing desativando a conversão de Punycode para IDN de forma geral. Para esta solução temporária, basta seguir dois passos:
- Aceder às definições do editor: escreva about:config na barra de endereços do navegador para abrir o editor de definições do Firefox.
- Forçar o Punycode: procure a configuração network.IDN_show_punycode e altere o valor de false para true.
Após a configuração, o Firefox apresentará os domínios internacionalizados na barra de endereços como cadeias ACE.