Comprobador de homógrafos IDN

Dos nombres pueden escribirse con caracteres distintos y, aun así, leerse igual. apple.com y аpple.com (donde esa primera letra es la a cirílica minúscula) son nombres distintos para la red y la misma palabra para un lector. Esta página desmonta un nombre y dice cuál de los dos es: divide el nombre en etiquetas, decodifica cada etiqueta xn-- a los caracteres que contiene, cuenta los bytes frente a los límites de DNS, nombra cada carácter parecido junto con la escritura de la que lo toma prestado, y pliega todo el nombre hacia la forma que imita. Informa de lo que encuentra y de lo que no encuentra, con el mismo nivel de detalle, de modo que una respuesta limpia significa que las comprobaciones se ejecutaron y pasaron, no que no se miró nada.
Todo el procesamiento se realiza en local en su navegador: el nombre que escribe nunca se sube ni se resuelve.

¿Es nuevo en esto? Los homógrafos IDN explicados en lenguaje sencillo: qué hace y qué no hace punycode, por qué a veces un navegador muestra xn--, y por qué esta página es un conjunto de comprobaciones y no un veredicto.
Leer la entrada como: Normalizar primero el nombre a NFC
SE LEE COMO —
FORMA DNS (lo que recibe un resolutor) —
TAMAÑO —
Todavía no se ha comprobado nada. Escriba o pegue un nombre arriba (de uno en uno) o pulse Cargar un ejemplo. La página lee un nombre suelto, un nombre extraído de una URL o una URL completa, y le dice cuál ha tomado. Cada comprobación que ejecuta aparece listada bajo el resultado, incluidas las que no encontraron nada.
¿Qué es un homógrafo IDN?
Un homógrafo es una palabra escrita de una forma y leída de otra. En un nombre de dominio, el truco suele costar un carácter: apple.com son siete letras latinas, mientras que аpple.com empieza por U+0430, la a minúscula cirílica, que se dibuja con la misma forma en todas las fuentes que tiene. Para la red, son dos nombres distintos. Para sus ojos, es la misma palabra, y solo una de las dos es la de Apple.

Durante las dos primeras décadas del DNS, los nombres solo admitían ASCII, por eso todo lo relativo a ellos se mide en bytes y letras: etiquetas de letras, dígitos y guiones, de como máximo 63 bytes cada una y 255 bytes en total. Un nombre de dominio internacionalizado (IDN) es lo que ocurre cuando las reglas se abren al resto de Unicode, y punycode (RFC 3492) es la regla de escritura que mantiene funcionando la maquinaria antigua: una etiqueta que contiene algo fuera de ASCII se escribe como una etiqueta xn--, una cadena ASCII que lleva los mismos caracteres en forma plegada. 中文.com viaja como xn--fiq228c.com, y ambas formas nombran el mismo host.

La parte que importa aquí es lo que punycode no hace. Convierte la escritura y nada más. No opina sobre si аpple.com debería poder aparecer junto a apple.com, y no se le puede preguntar, porque esa cuestión depende de los ojos y de las fuentes, no de los bytes. El registro decide qué caracteres vende, el navegador decide cómo mostrará un nombre que considera seguro, y el lector decide si hace clic. Esta página responde a la pregunta que hay debajo de las tres: de qué caracteres está hecho realmente este nombre y qué escribe en realidad.

Los casos con los que se comprueba esta página

Esta página ejecuta cada fila de la tabla siguiente al cargarse, y de nuevo con el botón Autoprueba, y la página tiene que informar exactamente de lo que dice cada fila: los mismos hallazgos, el mismo nivel, la misma forma DNS, el mismo recuento de bytes, ni más ni menos. Eso es lo que hace que una respuesta limpia aquí tenga valor: el camino de código que deja pasar un nombre corriente es el mismo que atrapa los trucos de abajo.

Qué es el caso Nivel Nombre tal como llega Lo que la página tiene que informar

Cómo decide esta página
  1. Extraiga el nombre de lo que pegó. Un nombre suelto se usa tal como está; una URL se le quita el host y se descartan el esquema, el puerto, la ruta y la consulta, y la página indica cuál de las dos cosas hizo en lugar de analizar en silencio una barra como si fuera parte de un nombre.
  2. Límpielo como lo haría un cliente. Se descartan los caracteres de control, los de ancho cero y la marca de orden de bytes; un punto completo o ideográfico cuenta como punto, y un punto final es la raíz y no un error. Cada carácter eliminado o reinterpretado de este modo se informa, porque un espacio de ancho cero descartado en silencio es exactamente lo que necesita saber.
  3. Divídalo en etiquetas y mida cada una. Una etiqueta no puede estar vacía, empezar o terminar con un guion, ni tener dos guiones en las posiciones tres y cuatro salvo que sea una etiqueta xn--. Cada etiqueta se mide en bytes UTF-8 frente al techo de 63 bytes, y el nombre completo frente a 255.
  4. Decodifique cada etiqueta xn-- a sus caracteres. La etiqueta decodificada se codifica una segunda vez y se compara con lo que escribió. Una etiqueta que no sobrevive a ese ida y vuelta no es la etiqueta que dice ser, y una que se decodifica a un carácter de control o a nada se informa como tal en lugar de descartarse en silencio.
  5. Pregunte qué es cada carácter. Su punto de código, sus bytes UTF-8, la escritura a la que pertenece, si está en un grupo de caracteres que se dibujan igual y qué otros miembros tiene ese grupo. Aquí es donde una a cirílica deja de ser «una letra» y pasa a ser «una letra con forma de una latina».
  6. Pliegue el nombre hacia la forma que imita. Cada carácter parecido se sustituye por el que se le asemeja, lo que convierte аpple.com en apple.com. Esa lectura plegada es la línea más útil de la página, porque apple.com es algo sobre lo que puede actuar, mientras que «una a cirílica» no lo es.
  7. Reúna los hallazgos e informe del peor. Cada hallazgo se informa una vez, con las etiquetas en las que aparece. Un nombre que solo parece inusual produce notas en lugar de hallazgos: mezclar Han y Kana, o terminar en el punto de la raíz, es escritura corriente y no un motivo de preocupación.

Los niveles y lo que afirman

ninguno no había nada que mencionar — bajo el mismo nombre escrito de otra forma — medio un carácter que DNS no admitirá, o que se pliega a una letra simple — alto un nombre construido para leerse como otro nombre, o uno que no puede enviarse en absoluto.

Un nivel es lo peor que podrían significar los hallazgos, no una probabilidad ni un juicio sobre el sitio. Un nombre perfectamente honrado puede ser «medio» porque contiene un carácter fuera del alfabeto del nombre de host, y uno hostil puede ser «alto» sin nada más sofisticado que una letra cirílica. La lista bajo el nivel dice por qué, una línea por hallazgo, y esa lista es la parte que merece leerse.

Las comprobaciones que ejecuta, una por una

La tabla siguiente se construye con la misma lista de la que informa la página, de modo que una fila aquí y un hallazgo en un resultado no pueden discrepar. Una comprobación que no encontró nada se lista como no: el sentido de la tabla es que pueda ver que la pregunta se hizo y se respondió, en lugar de preguntarse si llegó a hacerse.

Comprobación Lo peor que puede significar Qué busca

La misma lista alimenta las notas, que no llevan ningún nivel: una etiqueta sin ningún punto, un punto final de raíz, un dominio de nivel superior que no es ASCII, un separador distinto del punto, un nombre en mayúsculas, caracteres eliminados durante la limpieza y una URL reducida a su host.

Los límites que aplica DNS

Un nombre es una lista de etiquetas, y cada una se cuenta en bytes, no en caracteres. Esa distinción es toda la razón de ser de punycode: 中文 son dos caracteres y seis bytes, y su forma xn-- tiene quince caracteres, así que lo que tiene que caber es la escritura codificada. La página aplica ambos techos y dice cuál de ellos ha alcanzado.

Límite Valor Qué pasa en el límite
Por qué un navegador a veces muestra xn--

Quizá haya notado que un nombre escrito en chino, o en cirílico, a veces aparece en la barra de direcciones como un galimatías xn-- en lugar de los caracteres que espera. Eso es el navegador negándose a mostrar la forma bonita, no que el sitio no haya podido registrarla. Un navegador aplica una regla propia a un nombre que nunca ha visto antes, y la regla existe por la razón que justifica toda esta página: mostrar аpple.com como аpple.com es exactamente lo que quiere un atacante, así que un nombre desconocido de escritura mixta se muestra en su forma codificada hasta que se ha visto lo bastante a menudo como para considerarlo fiable.

Dónde aparece el nombre Qué se muestra Por qué

Lo que esta página no hará
Es un conjunto de comprobaciones, no un veredicto, y tampoco una lista de bloqueo. Informa de lo que está hecho un nombre; no sabe qué hace el sitio. Un nombre puede superar todas las comprobaciones de aquí y ser aun así una página de suplantación, y un nombre puede marcarse como de escritura mixta y ser un sitio web perfectamente corriente de alguien que escribe en su propio idioma. Los grupos de forma son un subconjunto escrito a mano de los confundibles de UTS #39, así que un par de caracteres que esta página no conoce es algo que no informará. Y nada de lo que aquí se hace se resuelve, descarga ni consulta: el nombre que escribe nunca sale del navegador, lo que también significa que la página no puede saber si un nombre existe.
De dónde vienen las reglas

Punycode es el RFC 3492, y la autoprueba de esta página ejecuta como primera comprobación las once etiquetas de ejemplo que aparecen impresas en ese documento, de modo que el codificador de aquí se mide con los ejemplos del estándar y no consigo mismo. Las reglas de procesamiento por las que pasa un IDN son el RFC 5891 con las tablas de caracteres del RFC 5892, y la capa de compatibilidad que aplican realmente los navegadores es UTS #46 con la marca no transicional; esta página le dice qué hacen esas reglas en lugar de fingir que las implementa, y el plegado que sí aplica (NFC y después minúsculas, y después RFC 3492) es la misma secuencia corta que realiza un cliente antes de enviar un nombre. Los grupos de forma, los rangos de escritura y las tablas de caracteres invisibles de esta familia de páginas se escribieron a mano para la familia: los estándares se citan para que pueda leerlos usted mismo, y no se reproduce aquí ningún texto de ellos.

Preguntas

¿Un nombre de escritura mixta es siempre un ataque?

No, y tratarlo así sería un error que importa. El japonés escribe caracteres Han y Kana en la misma palabra, y el coreano escribe caracteres Han dentro de los hangul. Lo que no tiene una explicación corriente es mezclar latino con cirílico o griego en una misma etiqueta, porque esas escrituras no se usan juntas en ningún idioma, y la página traza esa línea en lugar de marcar cualquier mezcla. Por eso las filas japonesa y coreana de la tabla de casos de arriba salen limpias.

Entonces, ¿por qué mi propio nombre sale como medio?

Probablemente porque contiene un carácter que el alfabeto del nombre de host no incluye (un guion bajo, un espacio, una tilde escrita como carácter de compatibilidad), y eso es «medio» porque el nombre no puede enviarse tal cual. Medio significa «esto necesita una revisión», no «esto es una falsificación». El hallazgo bajo el nivel indica el carácter exacto y su posición.

¿La página me dice si un nombre es peligroso, está registrado o es accesible?

No, en ninguno de los tres casos. Nunca toca la red ni resuelve nada, así que no puede saber si un nombre existe ni quién es su propietario, y deliberadamente no dice nada sobre lo que hace un sitio. Responde a una pregunta más estrecha que puede comprobar usted mismo: de qué caracteres está hecho este nombre, y si pliego los parecidos hacia las letras que imitan, ¿qué escribe?

Mi nombre está en chino y la página dice que el dominio de nivel superior no es ASCII. ¿Pasa algo?

No pasa nada. Un dominio de nivel superior chino viaja como una etiqueta xn-- propia, así que la última etiqueta del nombre se escribe en su forma codificada, y la página lo indica. Las notas no llevan nivel porque describen un hecho en lugar de un problema.

¿Por qué la línea «se lee como» a veces muestra el mismo nombre que escribí?

Porque la página solo muestra una lectura plegada cuando el plegado cambia realmente algo. Si cada carácter del nombre ya tiene la forma que imita, la lectura plegada y el nombre son la misma cadena, y no hay nada que decirle.

¿Qué es una etiqueta A y una etiqueta U?

Una etiqueta A es la escritura ASCII que viaja: xn--fiq228c. Una etiqueta U es la misma etiqueta escrita en la escritura a la que pertenece: 中文. Son dos formas de escribir una sola etiqueta, y la página muestra ambas para cada etiqueta que decodifica, para que vea lo que oculta una etiqueta codificada.