垃圾桶

EL PSY CONGROO.

Lz1y's avatar Lz1y

Punycode

Internationalized Domain Name

由于互联网起源于美国,使得英文成为互联网上资源的主要描述性文字。这一方面促使互联网技术和应用的国际化,另一方面,随着互联网的发展特别在非英文国家和地区的普及,又成为非英语文化地区人们融入互联网世界的障碍。2003年3月份IETF发布的多语种域名国际标准(RFC3454、RFC3490、RFC3491、RFC3492).

由此,国际化域名也应运而生.

国际化域名(英语:Internationalized Domain Name,缩写:IDN)又称特殊字符域名,是指部分或完全使用特殊的文字或字母组成的互联网域名,包括法语、阿拉伯语、中文、斯拉夫语、泰米尔语、希伯来语或拉丁字母等非英文字母,这些文字经多字节万国码编译而成。在域名系统中,国际化域名使用Punycode转写并以美国信息交换标准代码(ASCII)字符串储存。

虽说中文域名也已存在了十余年,但是它在中国互联网中却很少亮相.

一些公司,教育机构所使用的中文域名:

百度贴吧:  贴吧.公司
天津大学:  天津大学.cn

除了中文域名外,还有诸如 .公司 这类中文顶级域名可供注册.
万网中文域名

而目前绝大部分的主流浏览器(Safari,chrome,Firefox等)也早已支持IDN.

cURL的提示信息:
Input domain encoded as 'UTF-8'

cURL对域名做了如下转换:
贴吧。公司 => xn--4qrp14k.xn--55qx5d

想知道以上的转换是如何做到的,就不得不谈一下Punycode了.

Punycode

Punycode(译为:域名代码)是一种表示Unicode码和ASCII码的有限的字符集。例如:“münchen”(德国慕尼黑)会被编码为“mnchen-3ya”。

Punycode的目的是在于国际化域名标签(IDNA)的框架中,使这些(多语言)的域名可以编码为ASCII。编码语法在文档RFC3492中规定。

Punycode is a simple and efficient transfer encoding syntax designed
for use with Internationalized Domain Names in Applications (IDNA).
It uniquely and reversibly transforms a Unicode string into an ASCII
string. ASCII characters in the Unicode string are represented
literally, and non-ASCII characters are represented by ASCII
characters that are allowed in host name labels (letters, digits, and
hyphens). This document defines a general algorithm called
Bootstring that allows a string of basic code points to uniquely
represent any string of code points drawn from a larger set.
Punycode is an instance of Bootstring that uses particular parameter
values specified by this document, appropriate for IDNA.

说白了,Punycode就是将Unicode字符串转成ASCII范围的字符,而xn--就是声明后面的字符串全部是Unicode编码.

安全相关

由于全世界语种繁多,各式各样的文字涌入了域名难免会发生一些问题.

Punycode钓鱼攻击

许多Unicode字符,代表的是国际化的域名中的希腊、斯拉夫、亚美尼亚字母,看起来跟拉丁字母一样,但是计算机却会把他们处理成完全不一样网的网址。

比如说,斯拉夫字母“а”(U+0430)和拉丁字母“a”(U+0041)会被浏览器处理成不同的字符,但是在地址栏当中都显示为“a”。

由于之前的部分浏览器,并不是在地址栏上显示Punycode编码后的域名,这样一来,就会产生很多令人混淆不清的域名.
证书中显示的是

真假难以分辨
这个漏洞影响没有多长时间,在漏洞披露出来后没多久,受影响的厂商都在后来的更新把漏洞给修复了.

短域名

因为海量的Unicode字符,也经常出现一些比较有意思的事情.
mramydnei师傅14年在乌云上就发过一篇文章短域名进化史,详细讲解了利用Punycode低成本缩短域名至两位字符甚至一位字符.(ps:现在利用这个方法,长度至少三位)

例如:
㎉.㎝

差异化解析

  • JS中,编码前后的字符串不相同,但是同域
    和JS的差异化

  • 除了字符串,域名中的符号也是会参与到Punycode编码转换.

由于punycode不仅仅转换中文,所以除了简体中文的句号,还有台港澳的置中,日本的半角中式句号(U+FF61),台港澳置中(U+FE52),中国大陆标准为靠左下等…
除了句号外,常见的符号还有破折号也有此类特性…

ref

rfc3492
Punycode
国际化域名
短域名进化史
xn-on-domain-what-it-means
Internationalized_domain_name
This Phishing Attack is Almost Impossible to Detect On Chrome, Firefox and Opera