toolfree

Punycode 轉換

在瀏覽器裡把國際化域名與 Punycode 互轉,並看出一個網域是否混用文字系統來假冒另一個網域。

在你的瀏覽器中執行

請輸入一個網域名稱。

Punycode 是做什麼的

DNS 只承載 ASCII。用中文、阿拉伯文,或帶有德文變音符號寫成的網域,在查詢之前必須先轉成 ASCII,而 Punycode 就是那個轉換:台灣.tw 會變成 xn--kpry57d.tw

xn-- 這個前綴標示出一段標籤是編碼過的。它後面的東西就是原本的字元,被一套可逆但不可讀 的演算法打包成字母與數字。

你會在憑證名稱、DNS 記錄、郵件標頭和伺服器日誌裡看到編碼後的形式,而那通常就是你需要解碼 的時候。

真正重要的那一半:仿冒網域

Punycode 轉換本身只是算術。真正有趣的問題是:這個網域是不是在假冒另一個網域。

аpple.com——中間那個是西里爾字母 а——和 apple.com 是完全不同的兩個網域,而在大多數 字型下兩者根本分不出來。這就是同形異義字攻擊,也是這一頁會回報每一段標籤所使用的文字 系統的原因。

判準不是「含有西里爾字母」。有大量合法網域整個都是西里爾文——москва.рф 是一個再普通不過 的俄羅斯網域,而它裡面每一個字母都是拉丁字母的相似字。真正可疑的是單一標籤內混用了不同 文字系統:一堆拉丁字母中間夾著一個西里爾字母,沒有任何無辜的解釋。

所以這裡的檢查是逐標籤進行的,而單一文字系統的網域永遠不會被標記,不管是哪一種文字系統。 這大致上也是瀏覽器的做法:混用文字系統的標籤會被顯示成 Punycode 而不是那些字母,這就是 為什麼釣魚網域有時候會在網址列裡顯示成一串 xn-- 亂碼。

轉換用的是瀏覽器自己的實作

new URL() 執行的 IDNA 就是瀏覽器解析連結時所做的那一套,所以你在這裡看到的,就是你的 瀏覽器會做的事——而不是某個在關鍵邊界情況上可能不一致的重新實作。

解碼方向則是直接實作的,因為那個方向沒有平台 API。

中文域名

中文域名就是普通的 IDN:台灣.tw香港.hk中国.cn。它們都能正常解析,而且已經行之 有年,但經常被那些早於 IDN 的軟體弄壞——那時候你就需要 ASCII 形式來貼進去。

要注意的是,繁體與簡體是不同的網域。台灣.tw 和 台湾.tw 編碼出來不一樣,也是分開註冊 的,這在本地是真實的混淆來源。

沒有任何上傳

在這個頁面裡轉換,而且不會做 DNS 查詢——這裡告訴你的是一個名稱會編碼成什麼,而不是它存不 存在。