Control de nombres de dominio internacionalizados (IDN)
En este tema se describe cómo puede trabajar con nombres de dominio internacionalizados (IDN) en las aplicaciones. Los IDN se especifican mediante Network Working Group RFC 3490: nombre de dominio internacionalizado en aplicaciones (IDNA). Antes de este borrador estándar, los IDN estaban limitados a caracteres latinos sin diacríticos. IDNA permite que los IDN incluyan caracteres latinos con diacríticos, junto con caracteres de scripts no latinos, como cirílico, árabe y chino. El estándar también establece reglas para asignar IDN a nombres de dominio solo ASCII. Por lo tanto, los problemas de IDNA se pueden controlar en el lado cliente, sin necesidad de realizar cambios en el servidor de nombres de dominio (DNS).
Precaución
RFC 3490 presenta una serie de problemas de seguridad relacionados con el uso de IDN. Para obtener más información, consulte la sección relacionada de Consideraciones de seguridad: características internacionales.
Nota:
IDNA se basa actualmente en Unicode 3.2.
Funciones de API de NLS para controlar IDN
NLS incluye las siguientes funciones de conversión que la aplicación puede usar para convertir un IDN en diferentes representaciones. Para obtener un ejemplo del uso de estas funciones, consulte NLS: ejemplo de conversión de nombre de dominio internacionalizado (IDN).
- IdnToAscii. Convierte un IDN en Punycode.
- IdnToNameprepUnicode. Realiza la parte NamePrep de la conversión de un IDN a un nombre ASCII. Esta función crea una representación Unicode canónica de una cadena.
- IdnToUnicode. Convierte una cadena Punycode en una cadena UTF-16 normal.
NLS también define varias funciones de API que se pueden usar para mitigar algunos de los riesgos de seguridad presentados por la tecnología IDN. En Windows Vista y versiones posteriores, las siguientes funciones se usan para comprobar que los caracteres de un IDN determinado se dibujan completamente a partir de los scripts asociados a una configuración regional o configuraciones regionales concretas. Para obtener un ejemplo del uso de estas funciones, consulte NLS: ejemplo de mitigación de nombre de dominio internacionalizado (IDN).
- GetStringScripts. Proporciona una lista de scripts usados en una cadena determinada.
- GetLocaleInfo, GetLocaleInfoEx. Recupere información de configuración regional. El uso de las funciones con LCType establecido en LOCALE_SSCRIPTS proporciona una lista de scripts que se usan normalmente para una configuración regional determinada.
- VerifyScripts. Compara listas de scripts. Para comprobar en varias configuraciones regionales, la aplicación puede realizar varias llamadas a GetLocaleInfo o GetLocaleInfoEx y VerifyScripts.
En el caso de las aplicaciones que se ejecutan en Windows XP y Windows Server 2003, las funciones DownlevelGetLocaleScripts, DownlevelGetStringScripts, y DownlevelVerifyScripts desempeñan un papel similar a las funciones enumeradas anteriormente en la mitigación del riesgo de seguridad. La descarga "API de mitigación de nombres de dominio internacionalizados (IDN) de Microsoft" está disponible en archive.org.
Controlar cadenas Unicode
IDNA admite la transformación de cadenas Unicode en etiquetas de nombre de host legítimas, con la excepción de las cadenas que contienen determinados caracteres prohibidos, como caracteres de control, caracteres del área de uso privado (PUA) y similares. Su aplicación puede usar la marca IDN_USE_STD3_ASCII_RULES con varias funciones de conversión NLS para forzar que se produzcan errores en las funciones si encuentran caracteres ASCII distintos de letras, números o el carácter de guion menos (-) o si una cadena comienza o termina con el carácter menos de guiones. Estos caracteres siempre se han prohibido en los nombres de dominio y siguen prohibidos en el borrador estándar.
Control de los puntos de código sin asignar
Los IDN no pueden contener puntos de código sin asignar. Por lo tanto, los puntos de código que no están asociados a un carácter ("asignado") a partir de Unicode 3.2 no tienen asignaciones de IDN definidas, aunque la marca IDN_ALLOW_UNASSIGNED en determinadas funciones de conversión les permita asignarse a Punycode. Puede encontrar una lista de puntos de código sin asignar en RFC 3454.
Precaución
Si la aplicación codifica puntos de código sin asignar como Punycode, los nombres de dominio resultantes deben ser ilegales. La seguridad se puede poner en peligro si una versión posterior de IDNA hace que estos nombres sean legales o si la aplicación filtra los caracteres no válidos para intentar crear un nombre de dominio legal.
No se permiten puntos de código sin asignar en las cadenas almacenadas usadas en identificadores de protocolo y entidades con nombre, como nombres en certificados digitales y elementos de nombre de dominio DNS. Sin embargo, los puntos de código se permiten en cadenas de consulta, por ejemplo, nombres especificados por el usuario para entidades de certificación digitales y búsquedas DNS, que se usan para coincidir con identificadores almacenados.
Precaución
Aunque las cadenas de consulta pueden usar puntos de código sin asignar, no debe usarlas en las aplicaciones. Incluso una cadena de consulta proporcionada por el usuario presenta un riesgo de ataque de "suplantación de identidad". En este tipo de ataque, el sitio host no escrupuloso vuelve a enrutar a los usuarios del sitio al que pretenden acceder a otro sitio que podría proporcionar información confidencial a un tercero. Por ejemplo, copiar una cadena desde un correo electrónico entrante puede presentar los mismos riesgos que hacer clic en un vínculo en un explorador.
Conversión de nombres de dominio en nombres ASCII
La aplicación puede usar la función IdnToAscii y ciertas funciones de mitigación para convertir IDN a ASCII.
Precaución
Dado que las cadenas con representaciones binarias muy diferentes pueden compararse como idénticas, esta función puede generar ciertos problemas de seguridad. Para obtener más información, consulte la explicación de las funciones de comparación en Consideraciones de seguridad: características internacionales.
Ejemplos
NLS: ejemplo de conversión de nombre de dominio internacionalizado (IDN) muestra el uso de las funciones de conversión de IDN. NLS: ejemplo de mitigación de nombre de dominio internacionalizado (IDN) muestra el uso de las funciones de mitigación de IDN.
Temas relacionados