Manipulando IDNs (nomes de domínio internacionalizados)

Este tópico descreve como você pode trabalhar com IDNs (nomes de domínio internacionalizados) em seus aplicativos. Os IDNs são especificados pelo Grupo de Trabalho de Rede RFC 3490: Internacionalizando Nomes de Domínio em Aplicativos (IDNA). Antes desse padrão de rascunho, os IDNs eram limitados a caracteres latinos sem diacríticos. A IDNA permite que os IDNs incluam caracteres latinos com diacríticos, juntamente com caracteres de scripts não latinos, como cirílico, árabe e chinês. O padrão também estabelece regras para mapear IDNs para nomes de domínio somente ASCII. Assim, os problemas de IDNA podem ser tratados no lado do cliente, sem a necessidade de alterações de DNS (servidor de nome de domínio).

Cuidado

O RFC 3490 apresenta uma série de problemas de segurança relacionados ao uso de IDNs. Para obter mais informações, consulte a seção relacionada Considerações de Segurança: Recursos Internacionais.

 

Observação

A IDNA atualmente se baseia no Unicode 3.2.

 

Funções de API do NLS para lidar com IDNs

O NLS inclui as seguintes funções de conversão que seu aplicativo pode usar para converter um IDN em representações diferentes. Para obter um exemplo do uso dessas funções, consulte NLS: Exemplo de Conversão de IDN (Nome de Domínio Internacionalizado).

  • IdnToAscii. Converte um IDN em Punycode.
  • IdnToNameprepUnicode. Executa a parte NamePrep da conversão de um IDN em um nome ASCII. Essa função cria uma representação Unicode canônica de uma cadeia de caracteres.
  • IdnToUnicode. Converte uma cadeia de caracteres Punycode em uma cadeia de caracteres UTF-16 normal.

O NLS também define várias funções de API que podem ser usadas para atenuar alguns dos riscos de segurança apresentados pela tecnologia IDN. No Windows Vista e posterior, as funções a seguir são usadas para verificar se os caracteres em um determinado IDN são extraídos inteiramente dos scripts associados a uma localidade ou localidade específica. Para obter um exemplo do uso dessas funções, consulte NLS: Exemplo de Mitigação de IDN (Nome de Domínio Internacionalizado).

Para aplicativos executados no Windows XP e no Windows Server 2003, as funções DownlevelGetLocaleScripts ,DownlevelGetStringScripts eDownlevelVerifyScripts desempenham uma função semelhante às funções listadas acima na mitigação do risco de segurança. O download das "APIs de Mitigação do Nome de Domínio Internacionalizado da Microsoft (IDN) está disponível em archive.org.

Manipular cadeias de caracteres Unicode

O IDNA dá suporte à transformação de cadeias de caracteres Unicode em rótulos de nome de host legítimos, com exceção de cadeias de caracteres que contêm determinados caracteres proibidos, como caracteres de controle, caracteres da PUA (área de uso privado) e similares. Seu aplicativo pode usar o sinalizador IDN_USE_STD3_ASCII_RULES com várias funções de conversão NLS para forçar a falha das funções se encontrarem caracteres ASCII diferentes de letras, números ou o caractere hifen-menos (-) ou se uma cadeia de caracteres começar ou terminar com o caractere hifen-menos. Esses caracteres sempre foram proibidos de serem usados em nomes de domínio e permanecem proibidos no padrão de rascunho.

Manipular pontos de código não atribuídos

Os IDNs não podem conter pontos de código não atribuídos. Portanto, os pontos de código que não estão associados a um caractere ("atribuído") a partir do Unicode 3.2 não têm mapeamentos de IDN definidos, embora o sinalizador IDN_ALLOW_UNASSIGNED em determinadas funções de conversão permita que eles sejam mapeados para Punycode. Você pode encontrar uma lista de pontos de código não atribuídos no RFC 3454.

Cuidado

Se o aplicativo codificar pontos de código não atribuídos como Punycode, os nomes de domínio resultantes deverão ser ilegais. A segurança poderá ser comprometida se uma versão posterior do IDNA tornar esses nomes legais ou se o aplicativo filtrar os caracteres ilegais para tentar criar um nome de domínio legal.

 

Pontos de código não atribuídos não são permitidos nas cadeias de caracteres armazenadas usadas em identificadores de protocolo e entidades nomeadas, como nomes em certificados digitais e partes de nome de domínio DNS. No entanto, os pontos de código são permitidos em cadeias de caracteres de consulta, por exemplo, nomes inseridos pelo usuário para autoridades de certificado digital e pesquisas DNS, que são usadas para corresponder a identificadores armazenados.

Cuidado

Embora as cadeias de caracteres de consulta possam usar pontos de código não atribuídos, você não deve usá-los em seus aplicativos. Até mesmo uma cadeia de caracteres de consulta fornecida pelo usuário apresenta o risco de um ataque de "falsificação". Nesse tipo de ataque, o site de host inescrupuloso redireciona os usuários do site que eles pretendem acessar para outro site que possa fornecer informações confidenciais a terceiros. Por exemplo, copiar uma cadeia de caracteres de um email de entrada pode apresentar os mesmos riscos que clicar em um link em um navegador.

 

Converter nomes de domínio em nomes ASCII

Seu aplicativo pode usar a função IdnToAscii e determinadas funções de mitigação para converter IDNs em ASCII.

Cuidado

Como cadeias de caracteres com representações binárias muito diferentes podem ser comparadas como idênticas, essa função pode gerar certas preocupações de segurança. Para obter mais informações, consulte a discussão de funções de comparação em Considerações de Segurança: Recursos Internacionais.

 

Exemplos

NLS: O exemplo de Conversão de IDN (Nome de Domínio Internacionalizado) demonstra o uso das funções de conversão de IDN. NLS: Exemplo de mitigação de IDN (Nome de Domínio Internacionalizado) demonstra o uso das funções de mitigação de IDN.

Como Usar Suporte ao Idioma Nacional

Considerações de Segurança: Recursos Internacionais