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 查询——这里告诉你的是一个名称会编码成什么,而不是它存不 存在。