網域、電子郵件或 URL
在 Unicode 形式(如 ñandú.com.ar)與 DNS 使用的 Punycode ASCII 形式(如 xn--and-6ma2c.com.ar)之間轉換國際化網域名稱(IDN)。自動判斷轉換方向,支援電子郵件地址和完整 URL,並在網域混用多種文字冒充其他網域時發出警告。
最多 500 行。電子郵件只轉換網域部分,URL 只轉換主機部分。
結果
Unicode → ASCII
Unicodeñandú.com.ar
ASCIIxn--and-6ma2c.com.ar
ñandúxn--and-6ma2c13 · Latin
ASCII → Unicode
Unicodemünchen.de
ASCIIxn--mnchen-3ya.de
münchenxn--mnchen-3ya14 · Latin
Unicode → ASCII電子郵件
Unicodecontacto@correo.españa.es
ASCIIcontacto@correo.xn--espaa-rta.es
españaxn--espaa-rta13 · Latin
Unicode → ASCIIURL
Unicodehttps://日本語.jp/ページ
ASCIIhttps://xn--wgv71a119e.jp/%E3%83%9A%E3%83%BC%E3%82%B8
日本語xn--wgv71a119e14 · Han
Unicode → ASCII
Unicodeаррӏе.com
ASCIIxn--80ak6aa92e.com
аррӏеxn--80ak6aa92e14 · Cyrillic

此標籤完全由外觀與拉丁字母相同的西里爾字母或希臘字母組成,可能在冒充知名網域:信任該連結前請檢查其 xn-- 形式。

無前綴 Punycode(RFC 3492)

使用純 Punycode 演算法對任意文字進行編碼或解碼,不加上 xn-- 前綴,也不進行網域正規化。可用來除錯你自己的實作。

結果maana-pta

運作方式

DNS 只接受 ASCII 字母、數字和連字號,因此像 ñandú.com.ar 這樣的網域無法原樣傳送。國際化網域名稱(IDN)透過 Punycode(RFC 3492)解決這個問題:每個含有非 ASCII 字元的標籤都會以一種演算法編碼——保留一般字母,並在結尾附加特殊字元的位置資訊——然後加上 xn-- 前綴。於是 ñandú 就變成了 xn--and-6ma2c。

編碼之前,IDNA 會將名稱正規化:轉為小寫、統一 Unicode 形式,並轉換日文 。 等替代句點。本工具使用與瀏覽器開啟網址時相同的對應(UTS #46),因此結果與最終向 DNS 查詢的內容一致。電子郵件只轉換網域部分,URL 只轉換主機部分。

此外,它還會依長度和所用文字拆解每個標籤,並在網域混用多種文字,或以外觀與拉丁字母完全相同的西里爾字母或希臘字母書寫時發出警告:這正是同形異義字攻擊的基礎,也就是讓連結看起來像是來自知名網站。

範例

ñandú.com.arxn--and-6ma2c.com.ar只有含特殊字元的標籤會改變,com 和 ar 維持不變。這正是需要填入 DNS 和憑證 SAN 的形式。
faß.dexn--fa-hia.de在 IDNA2008 中,德文的 ß 是有效字母,會被編碼。依照舊標準它會被轉換為 ss,指向另一個網域 fass.de:因此部分舊系統會解析到不同的目標。
аррӏе.comxn--80ak6aa92e.comXudong Zheng 於 2017 年公布的同形異義字案例:五個西里爾字母,看起來與 apple 完全相同。此後 Chrome 和 Firefox 會以 xn-- 形式顯示這類網域。
пример.рфxn--e1afmkfd.xn--p1ai頂級網域也可以國際化:.рф 是俄羅斯的西里爾文頂級網域,在 DNS 中寫作 xn--p1ai。

使用情境

  • 取得中文或帶重音網域的 xn-- 形式,用於新增 DNS 記錄、設定 nginx 或 Apache,或填寫憑證的 SAN。
  • 弄清楚記錄檔、釣魚檢舉或瀏覽器網址列中出現的 xn-- 背後的真實網域。
  • 檢查可疑連結,找出模仿拉丁字母的西里爾字母或希臘字母。
  • 為不支援 SMTPUTF8 的伺服器轉換國際化電子郵件地址的網域。
  • 確認國際化網域編碼後每個標籤不超過 63 個字元。

常見問題

xn-- 前綴是什麼意思?

它是 ACE(ASCII Compatible Encoding)前綴,表示該標籤採用 Punycode 編碼。第三和第四個位置為連字號的標籤保留給這類前綴,因此除非是有效的 IDN,註冊管理機構不允許註冊以 xn-- 開頭的網域。

在 DNS、網頁伺服器和憑證中應該使用哪種形式?

所有技術場合都使用帶 xn-- 的 ASCII 形式:DNS 記錄、nginx 的 server_name、Apache 的 ServerName、憑證的 SAN 以及 Host 標頭。Unicode 形式僅用於顯示給人看;瀏覽器會在查詢前進行轉換。

什麼是同形異義字攻擊?

指利用其他字母系統的字母(例如以西里爾字母 a 取代拉丁字母 a)註冊一個看起來與另一個網域完全相同的網域。當標籤混用多種文字或與知名網域相似時,瀏覽器會顯示其 xn-- 形式。如果連結看起來正常,但其 ASCII 形式以 xn-- 開頭,請提高警覺。

電子郵件地址中可以使用非 ASCII 字元嗎?

網域部分可以,而且可以為任何伺服器轉換為 xn-- 形式。@ 之前的部分則是另一回事:若包含非 ASCII 字元,需要傳遞路徑上的所有伺服器都支援 SMTPUTF8(RFC 6531),而且它沒有對應的 Punycode 形式。

為什麼我含大寫字母的網域變了?

網域名稱不區分大小寫,IDNA 會在編碼前將所有字元轉為小寫:MÜNCHEN.de 和 münchen.de 是同一個網域 xn--mnchen-3ya.de。而純 Punycode 會保留大寫字母,因此無前綴轉換器會得出不同的結果。