Verificator de omografe IDN

Două nume pot fi scrise cu caractere diferite și totuși să se citească la fel. apple.com și аpple.com — unde prima literă este litera mică a chirilicii a — sunt nume diferite pentru rețea și același cuvânt pentru cititor. Această pagină descompune un nume și spune care dintre cele două este: împarte numele în etichete, decodează fiecare etichetă xn-- înapoi în caracterele pe care le conține, numără octeții față de limitele DNS, numește fiecare caracter asemănător împreună cu scriptul pe care îl împrumută și aduce întregul nume la forma pe care o imită. Raportează ce găsește și ce nu găsește, la același nivel de detaliu, astfel încât un răspuns curat înseamnă că verificările au rulat și au trecut, nu că nu s-a verificat nimic.
Toată prelucrarea are loc local în browser — numele scris nu este încărcat niciodată și nu este rezolvat.

Pentru cei care încep: Omografele IDN explicate pe înțelesul tuturor — ce face punycode și ce nu face, de ce un browser afișează uneori xn-- și de ce această pagină este un set de verificări, nu un verdict.
Se citește intrarea ca: Mai întâi se aduce numele la NFC
SE CITEȘTE CA —
FORMULAR DNS (ce primește un rezolvator) —
DIMENSIUNE —
Nimic verificat încă. Se scrie sau se lipește mai sus un nume — câte unul odată — sau se apasă Încarcă un exemplu. Pagina citește un nume simplu, un nume extras dintr-un URL sau un URL întreg și spune pe care l-a luat. Fiecare verificare pe care o rulează este listată sub rezultat, inclusiv cele care nu au găsit nimic.
Ce este un omograf IDN?
Un omograf este un cuvânt scris într-un fel și citit altfel. În numele de domeniu, trucul costă de obicei un singur caracter: apple.com are șapte litere latine, în timp ce аpple.com începe cu U+0430, litera mică a chirilicii, desenată cu aceeași formă în fiecare font uzual. Pentru rețea sunt două nume diferite. Pentru ochi sunt același cuvânt, iar doar unul dintre ele este al Apple.

Numele au fost doar ASCII în primii două decenii ai DNS-ului, de aceea totul despre ele se măsoară în octeți și litere: etichete din litere, cifre și cratime, cel mult 63 de octeți fiecare, cel mult 255 de octeți în total. Un nume de domeniu internaționalizat (IDN) este ceea ce se întâmplă când regulile se deschid restului Unicode, iar punycode (RFC 3492) este regula de scriere care păstrează în funcțiune vechiul mecanism: o etichetă care conține orice în afara ASCII este scrisă ca o etichetă xn--, un șir ASCII care poartă aceleași caractere într-o formă adusă la forma comună. 中文.com circulă ca xn--fiq228c.com, iar ambele forme numesc aceeași gazdă.

Partea care contează aici este ce nu face punycode. Convertește ortografia și nimic altceva. Nu are nicio părere dacă аpple.com ar trebui lăsat să stea alături de apple.com și nu poate fi întrebat, pentru că întrebarea ține de ochi și de fonturi, nu de octeți. Registrul decide ce caractere vinde, browserul decide cum afișează un nume considerat sigur, iar cititorul decide dacă dă clic. Pagina răspunde întrebării de sub toate trei: din ce caractere este alcătuit de fapt acest nume și ce înseamnă asta că scrie?

Cazurile pe care este verificată această pagină

Fiecare rând de mai jos este rulat de această pagină la încărcare și din nou prin butonul Autotestare, iar pagina trebuie să raporteze exact ce spune rândul — aceleași constatări, același nivel, aceeași formă DNS, același număr de octeți, nici mai mult, nici mai puțin. Tocmai de aceea un răspuns curat are valoare aici: calea de cod care lasă să treacă un nume obișnuit este aceeași care prinde trucurile de mai jos.

Ce este cazul Nivel Numele așa cum sosește Ce trebuie să raporteze pagina

Cum decide această pagină
  1. Numele se extrage din ceea ce s-a lipit. Un nume simplu se folosește așa cum este; un URL are gazda extrasă, iar schema, portul, calea și interogarea sunt eliminate, iar pagina spune care dintre cele două a făcut-o, în loc să analizeze în tăcere o bară oblică ca și cum ar face parte dintr-un nume.
  2. Numele se curăță așa cum ar face-o un client. Caracterele de control, caracterele de lățime zero și marcajul de ordine a octeților sunt eliminate, un punct cu lățime completă sau ideografic contează ca punct, iar un punct final este rădăcina, nu o greșeală. Fiecare caracter eliminat sau reinterpretat astfel este raportat, pentru că un spațiu de lățime zero eliminat în tăcere este exact ce trebuie să afli.
  3. Numele se împarte în etichete, iar fiecare se măsoară. O etichetă nu are voie să fie goală, să înceapă sau să se termine cu cratimă sau să conțină două cratime pe pozițiile trei și patru, decât dacă este o etichetă xn--. Fiecare etichetă se măsoară în octeți UTF-8 față de plafonul de 63 de octeți, iar întregul nume față de 255.
  4. Fiecare etichetă xn-- se decodează înapoi în caracterele sale. Eticheta decodată se codifică apoi din nou și se compară cu ce s-a scris. O etichetă care nu supraviețuiește acestui ciclu nu este eticheta pe care pretinde că o este, iar una care se decodează într-un caracter de control sau în nimic este raportată ca atare, în loc să fie eliminată discret.
  5. Se verifică ce este fiecare caracter. Punctul său de cod, octeții săi UTF-8, scriptul din care face parte, dacă se află într-un grup de caractere desenate la fel și care sunt ceilalți membri ai grupului. Aici un a chirilic încetează să mai fie „o literă” și devine „o literă cu forma uneia latine”.
  6. Numele se aduce la forma pe care o imită. Fiecare caracter asemănător este înlocuit cu caracterul căruia îi seamănă, ceea ce transformă аpple.com în apple.com. Această citire adusă la forma comună este cea mai utilă linie de pe pagină, pentru că apple.com este ceva ce se poate verifica, pe când „un a chirilic” nu.
  7. Constatările se adună, iar cea mai gravă se raportează. Constatările sunt raportate câte o dată, cu etichetele în care apar. Un nume care doar pare neobișnuit produce note, nu constatări: amestecul de han și kana sau terminarea cu punctul rădăcină este scriere obișnuită, nu un motiv de îngrijorare.

Nivelurile și ce pretind ele

none nimic aici nu merita menționat — low același nume scris a doua oară — medium un caracter pe care DNS nu îl va transporta sau unul care se aduce la o literă simplă — high un nume construit să fie citit ca alt nume sau unul care nu poate fi trimis deloc.

Un nivel reprezintă cel mai grav lucru pe care l-ar putea însemna constatările, nu o probabilitate și nu o judecată despre site. Un nume perfect onest poate fi „mediu”, pentru că include un caracter din afara alfabetului numelor de gazdă, iar unul ostil poate fi „ridicat” fără nimic mai sofisticat decât o literă chirilică. Lista de sub nivel spune de ce, câte o linie pentru fiecare constatare, iar această listă este partea care merită citită.

Verificările rulate, una câte una

Tabelul de mai jos este construit din aceeași listă din care raportează pagina, deci un rând de aici și o constatare dintr-un rezultat nu se pot contrazice. O verificare care nu a găsit nimic este listată ca nu: rostul tabelului este să se vadă că întrebarea a fost pusă și primită un răspuns, nu să se întrebe dacă întrebarea a fost pusă vreodată.

Verificare Cel mai rău lucru pe care îl poate însemna Ce caută

Aceeași listă conduce notele, care nu au deloc un nivel: o etichetă fără niciun punct în ea, un punct rădăcină final, un domeniu de nivel superior care nu este ASCII, un separator altul decât punctul, un nume scris cu majuscule, caractere eliminate în timpul curățării și un URL redus la gazdă.

Limitele impuse de DNS

Un nume este o listă de etichete, iar fiecare dintre ele se numără în octeți, nu în caractere. Această distincție este motivul întreg al existenței punycode: 中文 sunt două caractere și șase octeți, iar forma sa xn-- are cincisprezece caractere, deci forma codificată este cea care trebuie să încapă. Pagina aplică ambele plafoane și raportează care dintre ele a fost depășit.

Limită Valoare Ce se întâmplă la margine
De ce uneori un browser afișează xn--

Poate ai observat că un nume scris în chineză sau în chirilică apare uneori în bara de adrese ca un șir xn-- fără sens, în loc de caracterele așteptate. Asta înseamnă că browserul refuză să afișeze forma frumoasă, nu că site-ul nu s-a înregistrat. Un browser aplică o regulă proprie unui nume pe care nu l-a mai văzut, iar regula există din motivul pentru care există întreaga pagină: a afișa аpple.com ca аpple.com este exact ce își dorește un atacator, așa că un nume necunoscut cu scripturi amestecate se afișează în forma sa codificată până când a fost văzut suficient de des încât să fie considerat de încredere.

Unde apare numele Ce se afișează De ce

Ce nu face această pagină
Este un set de verificări, nu un verdict și nu o listă de blocare. Raportează din ce este alcătuit un nume; nu are nicio idee ce face site-ul. Un nume poate trece toate verificările de aici și totuși să fie o pagină de phishing, iar un nume poate fi semnalat ca nume cu scripturi amestecate și să fie un site web perfect obișnuit al cuiva care își scrie propria limbă. Grupurile de forme sunt un subset scris manual al confuzabililor din UTS #39, deci o pereche de caractere pe care pagina nu o cunoaște nu va fi raportată. Și nimic de aici nu este rezolvat, descărcat sau căutat: numele scris nu părăsește niciodată browserul, ceea ce înseamnă și că pagina nu poate ști dacă un nume există.
De unde provin regulile

Punycode este RFC 3492, iar autotestul acestei pagini rulează primele unsprezece etichete exemplu tipărite în acel document ca primă verificare, deci codificatorul de aici este evaluat după exemplele standardului, nu după el însuși. Regulile de procesare pe care le parcurge un IDN sunt RFC 5891 cu tabelele de caractere din RFC 5892, iar stratul de compatibilitate pe care îl aplică efectiv browserele este UTS #46 cu indicatorul netranzițional; pagina spune ce fac aceste reguli, în loc să pretindă că le implementează, iar aducerea la forma comună pe care o aplică — NFC, apoi minuscule, apoi RFC 3492 — este aceeași secvență scurtă pe care o execută un client înainte de a trimite un nume. Grupurile de forme, intervalele de scripturi și tabelele de caractere invizibile din această familie de pagini au fost scrise manual pentru familie: standardele sunt numite ca să le poți citi singur, iar textul lor nu este reprodus aici.

Întrebări

Un nume cu scripturi amestecate este întotdeauna un atac?

Nu, iar a trata așa ar fi greșit într-un mod care contează. Japoneza scrie caractere han și kana în același cuvânt, iar coreeana scrie caractere han în interiorul celor hangul. Ceea ce nu are o explicație obișnuită este latina amestecată cu chirilica sau cu greaca într-o aceeași etichetă, pentru că aceste scripturi nu sunt folosite împreună în nicio limbă, iar pagina trasează linia aici, în loc să semnaleze orice amestec. De aceea rândurile pentru japoneză și coreeană din tabelul cazurilor de mai sus ies curate.

Atunci de ce numele apare ca „mediu”?

Cel mai probabil pentru că include un caracter pe care alfabetul numelor de gazdă nu îl cuprinde — un underscore, un spațiu, un accent scris ca un caracter de compatibilitate — iar asta este „mediu”, pentru că numele nu poate fi trimis așa cum este. Mediu înseamnă „merită o privire”, nu „acesta este un fals”. Constatarea de sub nivel numește caracterul exact și poziția lui.

Pagina îmi spune dacă un nume este periculos, înregistrat sau accesibil?

Nu, în toate cele trei privințe. Nu atinge niciodată rețeaua și nu rezolvă nimic, deci nu poate ști dacă un nume există sau cine îl deține, iar în mod deliberat nu spune nimic despre ce face un site. Răspunde unei întrebări mai înguste pe care o poți verifica singur: din ce caractere este alcătuit acest nume și, dacă aduc asemănătorii la literele pe care le imită, ce scrie el?

Numele este în chineză, iar pagina spune că domeniul de nivel superior nu este ASCII. Este ceva în neregulă?

Nimic nu este în neregulă. Un domeniu de nivel superior chinezesc circulă ca o etichetă xn-- proprie, deci ultima etichetă a numelui este scrisă în forma sa codificată, iar pagina notează asta. Notele nu au niciun nivel, pentru că descriu un fapt, nu o problemă.

De ce rândul „se citește ca” arată uneori același nume pe care l-am scris?

Pentru că pagina arată o citire adusă la forma comună doar atunci când această aducere schimbă ceva. Dacă fiecare caracter din nume are deja forma pe care o imită, citirea adusă la forma comună și numele sunt același șir, iar nu există ce să semnaleze.

Ce este o etichetă A și o etichetă U?

O etichetă A este forma ASCII care circulă: xn--fiq228c. O etichetă U este aceeași etichetă scrisă în scriptul din care face parte: 中文. Sunt două forme ale unei singure etichete, iar pagina le arată pe amândouă pentru fiecare etichetă decodată, ca să se vadă ce ascunde o etichetă codificată.