IDN 동형글자 검사기

두 이름이 다른 문자로 쓰여도 같게 읽힐 수 있습니다. apple.com과 аpple.com — 첫 글자가 키릴 소문자 a — 은 네트워크에게는 다른 이름이고 읽는 사람에게는 같은 단어입니다. 이 페이지는 이름을 분해해 둘 중 어느 쪽인지 말합니다. 이름을 레이블로 쪼개고, 모든 xn-- 레이블을 실은 문자로 되돌려 디코딩하고, DNS 한도와 대조해 바이트를 세고, 각 닮은글자를 빌려 온 스크립트와 함께 이름 붙이고, 이름 전체를 흉내 내는 모양에 폴딩합니다. 찾은 것과 찾지 못한 것을 같은 상세 수준으로 보고하므로 깨끗한 답은 아무것도 안 살펴봤다는 것이 아니라 검사가 실행되어 통과했다는 뜻입니다.
모든 처리는 브라우저에서 로컬로 이루어집니다 — 입력하는 이름은 결코 업로드되지 않고 결코 확인되지 않습니다.

처음이신가요? 쉬운 말로 푼 IDN 동형글자 설명 — punycode가 하는 것과 하지 않는 것, 브라우저가 가끔 xn--을 보여주는 이유, 이 페이지가 판정이 아니라 검사 묶음인 이유.
입력을 다음으로 읽기: 이름을 먼저 NFC로 폴딩
다음으로 읽힘 —
DNS 형식 (리졸버가 받는 것) —
크기 —
아직 검사된 것이 없습니다. 위에 이름을 입력하거나 붙여넣으세요 — 한 번에 하나 — 또는 예제 불러오기를 누르세요. 페이지는 순수한 이름, URL에서 꺼낸 이름, 또는 URL 전체를 읽고 어느 것을 취했는지 말합니다. 수행하는 모든 검사는 결과 아래 나열되며 아무것도 찾지 못한 것도 포함됩니다.
IDN 동형글자란?
동형글자는 한 방식으로 쓰여 다르게 읽는 단어입니다. 도메인 이름에서 그 트릭은 보통 문자 하나의 값입니다. apple.com은 라틴 글자 일곱 개이고 аpple.com은 U+0430 키릴 소문자 a로 시작하며 그것은 당신의 모든 폰트에서 같은 모양으로 그려집니다. 네트워크에게 둘은 다른 이름입니다. 당신의 눈에게 둘은 같은 단어이고 그중 하나만 Apple의 것입니다.

DNS의 처음 20년 동안 이름은 ASCII뿐이었고 그래서 이름에 관한 모든 것이 바이트와 글자로 측정됩니다. 글자·숫자·하이픈의 레이블, 각 최대 63바이트, 전체 최대 255바이트. 국제화 도메인 이름(IDN)은 규칙이 Unicode의 나머지로 열릴 때 일어나는 일이고 punycode(RFC 3492)가 오래된 기계를 계속 돌게 하는 표기 규칙입니다. ASCII 밖의 것을 포함한 레이블은 xn-- 레이블로 쓰이며 같은 문자를 접힌 형태로 실는 ASCII 문자열입니다. 中文.com은 xn--fiq228c.com으로 여행하며 두 표기는 같은 호스트를 이름 짓습니다.

여기서 중요한 부분은 punycode가 하지 않는 것입니다. 표기만 바꿀 뿐입니다. аpple.com이 apple.com 옆에 앉아도 되는지에 의견이 없고 물을 수도 없습니다. 그 질문은 바이트가 아니라 눈과 폰트에 관한 것이기 때문입니다. 레지스트리가 어떤 문자를 팔지 결정하고 브라우저가 안전하다고 여기는 이름을 어떻게 표시할지 결정하고 읽는 사람이 클릭할지 결정합니다. 이 페이지는 그 셋 아래의 질문에 답합니다. 이 이름은 실제로 무엇으로 만들어졌으며 그것이 무엇이라 쓰이게 만드는가?

이 페이지가 검사받는 사례들

아래의 모든 행은 페이지가 로드될 때 이 페이지가 한 번 실행하고, 자체 테스트 버튼으로 다시 실행합니다. 페이지는 그 행이 보고한다고 밝힌 것과 정확히 일치하게 보고해야 합니다. 같은 발견, 같은 수준, 같은 DNS 형식, 같은 바이트 수로, 그 이상도 이하도 아니게. 바로 이것이 여기서 "깨끗한" 답에 무게가 실리는 이유입니다. 평범한 이름을 통과시키는 코드 경로가 아래의 속임수를 잡아내는 경로와 동일하기 때문입니다.

사례 수준 도착한 이름 페이지가 보고할 것

이 페이지가 결정하는 방식
  1. 붙여넣은 것에서 이름을 꺼냅니다. 순수한 이름은 그대로 두고 URL에서는 호스트를 취합니다.
  2. 클라이언트가 하듯 청소합니다. 제어 문자와 보이지 않는 문자는 제거되고 전각 마침표는 점으로 읽힙니다.
  3. 레이블로 나누어 각각 측정합니다. 레이블은 비어 있을 수 없고, 하이픈으로 시작하거나 끝날 수 없으며, 3번째와 4번째 자리에 하이픈 두 개를 가질 수 없습니다. 단, xn-- 레이블은 예외입니다. 각 레이블은 UTF-8 바이트로 63바이트 상한에 대해 측정하고, 전체 이름은 255바이트에 대해 측정합니다.
  4. 모든 xn-- 레이블을 실은 문자로 되돌립니다. A-레이블이 여행하는 형태이고 Unicode가 보이는 형태입니다.
  5. 각 문자가 무엇인지 물으세요. 코드포인트, UTF-8 바이트, 속한 문자 체계, 모양이 비슷한 문자 그룹에 속하는지, 그리고 그 그룹의 다른 구성원은 무엇인지. 바로 여기서 키릴 문자 а가 더 이상 "하나의 글자"가 아니라 "라틴 글자처럼 생긴 글자"가 됩니다.
  6. 이름을 닮으려는 모양에 맞춰 접습니다. 모든 비슷하게 생긴 문자는 그것과 닮은 문자로 바뀌며, 이 과정에서 аpple.com이 apple.com이 됩니다. 이렇게 접힌 해석이 이 페이지에서 가장 유용한 줄입니다. "키릴 문자 a"는 행동할 수 없지만 apple.com은 행동할 수 있는 대상이기 때문입니다.
  7. 발견을 모아 최악을 보고합니다. 수준은 발견이 의미할 수 있는 최악의 것이며 그 이상도 이하도 아닙니다.

수준들과 그것들이 주장하는 것

없음 여기엔 언급할 만한 것이 없습니다 — 낮음 같은 이름의 다른 표기 — 중간 DNS가 담을 수 없는 문자, 또는 정규화하면 평범한 글자가 되는 문자 — 높음 다른 이름을 의도적으로 사칭하는 이름, 또는 아예 전송할 수 없는 이름.

수준은 발견이 의미할 수 있는 최악의 것이지, 발견보다 많지도 적지도 않습니다. 아래 표는 수준이 정해지는 방식을 보여줍니다. 같은 이름이 사례 표에서는 깨끗하고 여기서는 보고되는 것은 사례 표가 각 사례에 대해 특정 발견만 확인하기 때문입니다. 정확히 하자면:

수행하는 검사들, 하나씩

아래 표는 페이지가 보고하는 것과 같은 목록에서 만들어지므로, 여기의 행과 결과의 발견 사항이 서로 어긋날 수 없습니다. 아무것도 찾지 못한 검사는 없음으로 표시됩니다: 표의 요점은 질문이 던져지고 답이 나왔다는 것을 볼 수 있게 하는 데 있습니다. 그 질문이 던져졌는지조차 궁금해하지 않도록 하는 것입니다.

검사 최악의 의미 찾는 것

같은 목록이 노트를 만듭니다. 노트는 수준을 가지지 않으며 수준에 영향을 주지 않습니다.

DNS가 강제하는 한계

이름은 레이블의 목록이며, 각 레이블은 글자 수가 아니라 바이트 수로 셉니다. 이 차이가 바로 punycode가 존재하는 이유입니다: 中文은 두 글자이지만 여섯 바이트이고, 그 xn-- 형태는 열다섯 글자이므로, 담아야 하는 것은 인코딩된 표기입니다. 이 페이지는 두 가지 상한을 동시에 적용하고 어느 쪽에 걸렸는지 알려 줍니다.

한계 값 가장자리에서 일어나는 일
브라우저가 가끔 xn--을 보여주는 이유

중국어나 키릴 문자로 쓰인 이름이 주소창에 기대한 문자 대신 xn--로 시작하는 낯선 철자로 나타나는 것을 본 적이 있을 것입니다. 이는 브라우저가 보기 좋은 형태를 표시하지 않는 것이지, 사이트 등록에 실패한 것이 아닙니다. 브라우저는 한 번도 본 적 없는 이름에 자체 규칙을 적용하며, 그 규칙이 존재하는 이유가 바로 이 페이지가 존재하는 이유입니다. аpple.com을 аpple.com으로 보여 주는 것은 공격자가 원하는 바로 그것이므로, 낯선 혼용 문자 이름은 충분히 자주 보여 신뢰를 얻을 때까지 인코딩된 철자로 표시됩니다.

이름이 나타나는 곳 표시되는 것 이유

이 페이지가 하지 않을 것
이것은 검사 묶음이지 판정이나 차단 목록이 아닙니다. 이름이 무엇으로 만들어졌는지 보고할 뿐 사이트가 무엇을 하는지 모릅니다. 이름이 여기 모든 검사를 통과하고도 피싱 페이지일 수 있고 혼합 스크립트 이름으로 깃발이 붙고도 자기 언어를 쓰는 누군가의 지극히 평범한 웹사이트일 수 있습니다. 모양 그룹은 UTS #39 confusables의 손으로 쓴 부분집합이므로 이 페이지가 모르는 문자 쌍은 보고되지 않습니다. 그리고 여기서 아무것도 확인·다운로드·조회되지 않습니다. 입력한 이름은 브라우저를 떠나지 않으며 페이지가 이름의 존재를 알 수 없다는 뜻이기도 합니다.
규칙의 출처

Punycode는 RFC 3492이며 이 페이지의 자체 테스트는 그 문서에 인쇄된 열한 개 샘플 레이블을 첫 검사로 돌립니다. 그래서 여기의 인코더는 자기 자신이 아니라 표준의 예제에 묶여 있습니다. IDN이 거치는 처리 규칙은 RFC 5891과 RFC 5892의 문자 표이며 브라우저가 실제로 적용하는 호환 계층은 비전이 플래그를 가진 UTS #46입니다. 이 페이지는 그 규칙을 구현하는 척 대신 그것들이 무엇을 하는지 말하고, 실제로 적용하는 폴딩 — NFC 후 소문자, 그다음 RFC 3492 — 은 클라이언트가 이름을 보내기 전에 수행하는 같은 짧은 순서입니다. 이 페이지 family의 모양 그룹, 스크립트 범위, 보이지 않는 문자 표는 family를 위해 손으로 작성되었습니다. 표준은 직접 읽을 수 있도록 이름이 밝혀져 있고 여기엔 어떤 텍스트도 재현되지 않습니다.

질문

혼합 스크립트 이름은 항상 공격인가요?

아니오. 그렇게 대하는 것은 중요한 방식으로 틀립니다. 일본어는 같은 단어에 한자와 가나를 쓰고 한국어는 한글 안에 한자를 씁니다. 평범한 설명이 없는 것은 한 레이블에서 라틴과 키릴/그리스가 섞인 경우입니다. 그 스크립트들은 어떤 언어에서도 함께 쓰이지 않기 때문이며 페이지가 모든 혼합에 깃발을 달지 않고 그 선을 긋습니다. 위 사례 표의 일본어·한국어 행이 깨끗하게 나오는 이유입니다.

그럼 왜 제 이름은 medium으로 나오나요?

가장 가능성 높은 이유는 호스트 이름 알파벳에 없는 문자 하나를 포함하기 때문입니다 — 밑줄, 공백, 호환 문자로 쓰인 악센트 — 그리고 그것은 이름을 있는 그대로 보낼 수 없어 medium입니다. Medium은 "한 번 봐야 함"이지 "위조"가 아닙니다. 수준 아래의 발견이 정확한 문자와 위치를 이름 붙입니다.

페이지가 이름이 위험한지, 등록되었는지, 닿을 수 있는지 말해주나요?

셋 모두 아니오. 네트워크에 닿지 않고 아무것도 확인(resolve)하지 않아 이름이 존재하는지 누가 소유하는지 알 수 없고 사이트가 무엇을 하는지에 대해서는 일부러 말하지 않습니다. 스스로 확인할 수 있는 더 좁은 질문에 답합니다. 이 이름은 어떤 문자로 이루어졌으며 닮은글자를 흉내 낸 글자에 폴딩하면 무엇이라 읽히는가?

제 이름이 중국어인데 페이지가 최상위 도메인이 국제화되지 않았다고 합니다

잘못된 것은 없습니다. 중국어 최상위 도메인은 자체 xn-- 레이블로 전달되므로, 이름의 마지막 레이블은 인코딩된 형태로 적히고 페이지가 이를 알려 줍니다. 노트는 문제가 아니라 사실을 설명하므로 수준이 없습니다.

왜 reads-as 줄이 가끔 같은 이름을 두 번 보여주나요?

폴딩이 이름을 바꾸지 않을 때만 폴딩된 읽기를 보여주기 때문입니다.

A-레이블과 U-레이블이란?

A-레이블은 전달되는 ASCII 표기입니다: xn--fiq228c. U-레이블은 같은 레이블을 속한 문자 체계로 쓴 것입니다: 中文. 둘은 하나의 레이블에 대한 두 가지 표기이며, 페이지는 디코딩하는 모든 레이블에 대해 둘을 함께 보여 줘서 인코딩된 레이블이 무엇을 숨기고 있는지 볼 수 있게 합니다.