Cos'è Punycode?
Punycode è una sintassi di codifica definita in RFC 3492 che trasforma stringhe Unicode nell'insieme di caratteri ASCII limitato supportato da DNS. È il fondamento tecnico che rende possibili i nomi di dominio internazionalizzati (IDN), consentendo ai nomi di dominio in qualsiasi lingua di funzionare con l'infrastruttura DNS esistente.
Il problema che Punycode risolve
Il Domain Name System è stato progettato negli anni '80 con in mente solo i caratteri ASCII. Le etichette DNS possono contenere solo:
- Lettere minuscole (a-z)
- Cifre (0-9)
- Trattini (-)
Questa limitazione escludeva miliardi di utenti di internet che non utilizzano principalmente l'alfabeto latino. Punycode colma questo divario codificando qualsiasi stringa Unicode nell'insieme ASCII valido.
Come funziona la codifica Punycode
Punycode utilizza un algoritmo intelligente che preserva i caratteri ASCII mentre codifica i caratteri non ASCII in una rappresentazione ASCII compatta.
Il processo di codifica
1. Caratteri separati: Dividi in caratteri ASCII e non ASCII
2. Copia ASCII: Mantieni tutti i caratteri ASCII nelle loro posizioni originali
3. Codifica non ASCII: Utilizza una codifica di interi a lunghezza variabile generalizzata
4. Aggiungi il prefisso: Anteponi "xn--" per indicare la codifica Punycode
Esempi
| Originale (Unicode) | Codificato (Punycode) |
|---|---|
| münchen | xn--mnchen-3ya |
| 北京 | xn--fiqs8s |
| münchen.de | xn--mnchen-3ya.de |
| 中文.com | xn--fiq228c.com |
| café.com | xn--caf-dma.com |
Il prefisso "xn--"
Il prefisso "xn--" è chiamato ACE (ASCII Compatible Encoding). Segnala ai risolutori DNS e alle applicazioni che l'etichetta contiene contenuto codificato Punycode. Questo prefisso:
- È sempre minuscolo
- Non appare mai nei nomi di dominio ASCII regolari
- Attiva la decodifica Unicode nel software conforme
Punycode in pratica
Gestione del browser
I browser moderni gestiscono automaticamente Punycode:
L'utente digita: 中文.com
Il browser invia: xn--fiq228c.com (al DNS)
Il browser visualizza: 中文.com (nella barra degli indirizzi)
Implementazione dello sviluppatore
JavaScript (Node.js):const punycode = require('punycode/');
// Codifica a Punycode
const encoded = punycode.toASCII('münchen.de');
// Risultato: xn--mnchen-3ya.de
// Decodifica da Punycode
const decoded = punycode.toUnicode('xn--mnchen-3ya.de');
// Risultato: münchen.de
Python:
domain = 'münchen.de'
encoded = domain.encode('idna').decode('ascii')
# Risultato: xn--mnchen-3ya.de
Gestione degli URL
Quando si lavora con gli URL contenenti IDN:
// L'API URL gestisce Punycode automaticamente
const url = new URL('https://中文.com/path');
console.log(url.hostname); // xn--fiq228c.com
console.log(url.href); // https://xn--fiq228c.com/path
Implicazioni sulla sicurezza
La capacità di Punycode di rappresentare qualsiasi carattere Unicode crea rischi di sicurezza:
Spoofing visivo
Gli attaccanti possono registrare domini che sembrano identici a siti legittimi:
аррlе.com (cirillico 'а' e 'р')
apple.com (lettere latine)
Entrambi appaiono identici in alcuni caratteri ma sono domini diversi.
Protezioni del browser
Per combattere lo spoofing, i browser implementano protezioni:
1. Rilevamento di script misti: Visualizza Punycode per gli IDN sospetti invece dell'Unicode
2. Rilevamento confusionario: Contrassegna i domini che utilizzano caratteri che sembrano ASCII
3. Whitelisting: Consenti la visualizzazione Unicode solo per i TLD ben noti
Lavorare con Punycode nelle API
Quando crei strumenti di dominio:
Memorizza sempre Punycode: Utilizza la forma ASCII internamente per coerenza e indicizzazione del database. Accetta entrambi i moduli: Consenti agli utenti di inserire Unicode o Punycode, convertendo secondo necessità. Visualizza Unicode: Mostra la forma leggibile dall'uomo nelle interfacce utente.function normalizeDomain(input) {
const punycode = require('punycode/');
// Converti a Punycode minuscolo per l'uso interno
return punycode.toASCII(input.toLowerCase());
}
Punycode è trasparente alla maggior parte degli utenti ma è una conoscenza essenziale per gli sviluppatori che creano applicazioni web internazionali.