Punycode este o metodă de codificare standardizată care permite maparea caracterelor Unicode utilizând un set limitat de caractere ASCII, ceea ce înseamnă că numele de domenii internaționalizate (IDN) pot conține și caractere non-ASCII, cum ar fi, de exemplu, umlauturile.

Cum a fost dezvoltată metoda de codificare?

În 2003, Punycode a fost standardizat de Internet Engineering Task Force (IETF) ca sintaxă pentru codificarea numelor de domenii internaționalizate în aplicații (IDNA). IETF definește un nume de domeniu ca IDN dacă acesta conține caractere speciale, cum ar fi diacritice, litere sau caractere care nu se regăsesc în alfabetul latin (de exemplu, umlauturi în limba germană). Astfel de caractere nu pot fi procesate de protocoale de bază, cum ar fi Sistemul de nume de domeniu (DNS). Pentru acest exemplu, vom folosi un nume de domeniu în limba germană. Deși, după introducerea IDN-urilor, müller-büromöbel (mobilier de birou Müller) este permis sub domeniul de nivel superior .de, acesta poate fi procesat numai prin codificarea caracterelor non-bază, de exemplu, în contextul rezoluției numelui. Numeroase protocoale de internet se bazează pe limba engleză și, prin urmare, acceptă numai setul limitat de caractere ASCII.

Pentru a asigura compatibilitatea între IDN-uri și standardele internet mai vechi, IETF a prescris o metodă de codificare a numelor de domeniu internaționalizate utilizând caracterele care erau deja permise. Această procedură de codificare standardizată este cunoscută sub numele de Punycode.

Notă

Pentru adresele de e-mail, Punycode este utilizat numai pentru domeniile de e-mail internaționalizate. Dacă partea locală (înainte de caracterul @) conține caractere non-ASCII, aceasta este codificată prin UTF-8.

Cum funcționează codificarea Punycode?

O prezentare generală a procesului Punycode

Punycode este definit de IETF în RFC 3492 ca o posibilă aplicație a algoritmului general de codificare cunoscut sub numele de Bootstring. Algoritmul Bootstring permite maparea șirurilor de caractere care cuprind seturi de caractere arbitrare cu o selecție limitată de elemente. Dezvoltarea procedurii de codificare se bazează pe șase principii. În codificarea Punycode, aceste elemente sunt numite caractere de bază, care constau din litere mici, cifre și cratimă (-). Dezvoltarea metodei de codificare se bazează pe șase principii.

  • Completitudine: Fiecare șir de ieșire poate fi mapat la un șir simplificat folosind un șir de boot.
  • Unicitate: Atribuirea șirului de ieșire codificării Bootstring respective este unică. Fiecare Punycode poate fi atribuit exact unui omolog ASCII și viceversa.
  • Reversibilitate: O codificare Bootstring poate fi inversată în orice moment fără pierderi de informații.
  • Eficiență: șirul codificat este – dacă este cazul – doar puțin mai lung decât șirul de ieșire.
  • Simplitate: Bootstring utilizează algoritmi simpli de codificare și decodificare.
  • Lizibilitate: Numai caracterele care nu pot fi reprezentate în setul de caractere țintă sunt codificate. Toate celelalte caractere rămân neschimbate.

Punycode specifică Bootstring în conformitate cu cerințele pentru numele de domenii internaționalizate. Acest lucru ar trebui să permită maparea caracterelor Unicode prin intermediul caracterelor de bază permise anterior.

Exemplu de punycode

Următorul exemplu arată cum funcționează codificarea:

IDN: müller-büromöbel

IDN müller-büromöbel conține caracterele ü și ö, care nu sunt incluse în setul de caractere permis anterior pentru numele de domenii. Prin urmare, acestea trebuie codificate prin Punycode pentru a asigura compatibilitatea.

Pasul 1: Normalizarea

În prima etapă, procedura de codificare permite normalizarea șirului de caractere de ieșire. Toate literele majuscule sunt înlocuite cu literele minuscule corespunzătoare.

Pasul 2: Eliminarea tuturor caracterelor care nu sunt de bază

În a doua etapă, toate caracterele care nu sunt de bază sunt eliminate. Acestea sunt apoi adăugate la numele de domeniu sub formă codificată și separate printr-o cratimă.

Dacă sintaxa Punycode este utilizată pentru codificarea adreselor de internet, fiecare șir de rezultate este prevăzut cu un prefix ACE (prescurtarea de la ASCII-compatible encoding, codificare compatibilă cu ASCII):

Prefix ACE: xn–

Prefixul ACE asigură că numele de domeniu care conțin cratime nu sunt interpretate greșit ca nume de domeniu internaționale.

Rezultatul este următoarea codificare pentru IDN müller-büromöbel:

ACE: xn–mller-brombel-rmb4fg

Algoritmul care stă la baza procedurii Punycode este remarcabil. Acesta asigură că, în ciuda conversiei, etichetele domeniilor nu depășesc lungimea maximă de 63 de caractere.

În timpul procesului de codificare, caracterele Unicode nu sunt convertite unul la unul în caractere ASCII. În schimb, algoritmul determină un șir pe baza distanței dintre caracterele șterse și poziția caracterelor în șirul de ieșire.

În legătură cu exemplul prezentat mai sus, șirul rmb4fg indică faptul că mller-brombel trebuie completat cu caracterele Unicode ü și ö în poziția a doua și a șaptea.

Imagine: Overview of sections of the ACE string
The ACE string consists of the ACE prefix and a puny-coded string.

Excepții de la regulă

Deviațiile apar dacă numele de domeniu nu conține caractere non-bază sau dacă conține numai caractere non-bază.

Un nume de domeniu care conține numai caractere non-bază afișează numai șirul codificat și prefixul ACE după codificare. Un nume de domeniu precum παράδειγμα (grecesc pentru „exemplu”) corespunde următoarei codificări:

IDN: exemplu

ACE: xn–hxajbheg2az3al

Dacă un nume de domeniu conține numai caractere de bază, Punycode nu este utilizat. În consecință, nu se adaugă niciun prefix ACE. Codificarea nu este necesară în acest caz, deoarece protocoalele de internet de bază pot deja înțelege numele de domeniu.

Dacă luați în considerare numele de domeniu complet calificat (FQDN) în ansamblu, fiecare etichetă (domeniu de nivel superior, domeniu de nivel secundar, domeniu de nivel terțiar etc.) este codificată separat. Un domeniuprecum пример.бг (în bulgară „example.bg”) ar putea fi codificat după cum urmează

IDN: пример.бг

ACE: xn–e1afmkfd.xn–90ae

Tabelul următor oferă o prezentare generală a diferitelor variante ale sintaxei Punycode.

IDN Punycode ACE
Caractere de bază și non-bază müller-büromöbel.de mller-brombel-rmb4fg.de xn--mller-brombel-rmb4fg.de
Numai caractere non-bază Παράδειγμα.gr hxajbheg2az3al.gr xn--hxajbheg2az3al.gr
Numai caractere de bază example.org example.org Inutil
Notă

Algoritmul Punycode este descris în detaliu în RFC 3492. În plus, documentul oferă o implementare a procedurii de codificare în limbajul de programare C.

Utilizatorii apelează de obicei la convertoare Punycode disponibile gratuit pentru codificarea numelor de domenii internaționalizate.

Codificare slabă cu domenii emoji

Nu numai numele de domenii internaționalizate, ci și domeniile emoji pot fi realizate prin Punycode. Pentru ca acest lucru să funcționeze, însă, domeniul de nivel superior trebuie să permită utilizarea emoji-urilor, iar emoticonul dorit trebuie să fie în standardul Unicode.

Sfat

În prezent, următoarele TLD-uri permit înregistrarea domeniilor emoji: .ws, .tk, .to, .ml, .ga, .cf, .gq și .fm.

Domeniile Emoji sunt procesate tehnic ca Punycode, dar, în teorie, ar trebui să fie prezentate utilizatorului ca o combinație de text și emoticoane.

Domeniul Emoji: https://i❤.ws/

ACE: https://xn--i-7iq.ws/

Practic, niciun browser standard nu implementează această funcție în prezent. Dacă introduceți un domeniu emoji în Firefox, Chrome, Safari, Edge sau Opera, bara de adrese afișează doar șirul ACE.

Există convertoare Punycode gratuite?

Generatoare gratuite de Punycode care transferă IDN-urile într-un format compatibil cu ASCII pot fi găsite pe diverse site-uri web. Un exemplu este Punycoder.

Imagine: Punycoder, the Punycode converter
Punycoder converts Punycode to Text/Unicode and vice-versa.

Pentru IDN-urile altor TLD-uri, convertorul Punycode creat de Mathias Bynens pe baza punycode.js este o alegere bună.

Imagine: The Punycode converter made by Mathias Bynens based on punycode.js
With his *Punycode domain name converter,*Mathias Bynens offers an open-source tool for converting internationalised domains.

Punycode reprezintă un risc pentru securitate?

Punycode devine un risc de securitate în cazul phishingului homografic – atacuri cibernetice în care infractorii folosesc aspectul similar al diferitelor caractere pentru a atrage victime neștiutoare către site-uri web false. Bloggerul Xudong Zheng arată cum arată un atac de phishing folosind ca exemplu următorul domeniu Punycode https://www.xn--80ak6aa92e.com/. Acest lucru conduce utilizatorii de internet către un site web cu următorul IDN: https://www.аррӏе.com/

Adresa URL furnizată nu este site-ul oficial al companiei de tehnologie Apple Inc. din California, ci un site de phishing creat în scop demonstrativ.

În locul caracterului ASCII a cu Unicode U+0061, se utilizează caracterul chirilic а (U+0430) – aceste două caractere sunt greu de distins cu ochiul liber, dar sunt interpretate ca caractere diferite de browserele web. Nici măcar certificatele nu pot oferi securitate pentru a proteja utilizatorii de internet. Pentru campaniile moderne de phishing, infractorii creează certificate SSL valide cu scopul de a face site-urile lor web să pară autentice.

Versiunile actuale ale Chrome și Opera previn atacurile de phishing de acest tip afișând șirul ACE în locul domeniului internaționalizat pe IDN-uri care combină caractere din seturi de caractere diferite. Internet Explorer și Microsoft Edge împiedică accesarea domeniilor de acest tip. Firefox, însă, nu oferă nicio protecție împotriva phishingului Punycode.

Imagine: Example of a homographic attack
Example of a homographic domain: The URL looks the same as Apple’s official website, however, the Unicode character U+0430 is actually a Cyrillic letter that is astonishingly similar to the ASCII character a.

Iată cum se pot proteja utilizatorii Firefox. Pentru a reduce riscul pe care îl prezintă site-urile de phishing, utilizatorii Firefox au în prezent doar opțiunea de a împiedica traducerea Punycode în IDN-uri în general. Pentru această soluție temporară sunt necesari doar doi pași:

  1. Accesați editorul de configurare: Tastați about:config în bara de adrese a browserului web pentru a deschide editorul de configurare Firefox.
  2. Forțați Punycode: Găsiți setarea network.IDN_show_punycode și modificați valoarea acesteia de la false la true.

După configurare, Firefox va afișa domeniile internaționalizate în bara de adrese sub formă de șiruri ACE.

Mergi la meniul principal