Punycodes 解释

Punycodes 解释

源节点: 1903509

当您仅限于 ASCII 时,如何表示更复杂的事物,例如表情符号或非拉丁字符?一个答案是 Punycode,它是一种用 ASCII 表示 Unicode 字符的方法。然而,虽然您可以从技术上将 Unicode 的原始位编码为字符,例如 Base64,有一个障碍。域名系统 (DNS) 通常要求主机名不区分大小写,因此无论您输入 HACKADAY.com、HackADay.com 还是只是 hackaday.com,它都会转到同一个位置。

[A。 Costello]在加州大学伯克利分校提出了 Punycode 的想法 RFC 3492 2003 年 XNUMX 月。它概述了一种简单的算法,其中所有常规 ASCII 字符都被拉出并粘在一侧,中间有一个分隔符,在本例中为连字符。然后 Unicode 字符被编码并粘在字符串的末尾。

首先,将数字代码点和字符串中的位置相乘。然后该数字被编码为 BASE-36 (az 和 0-9)可变长度整数。例如,问候语和感谢的希腊语,“嘿,ευχαριστώ” 变成“嘿,-mxahn5algcq2”。同样,美丽的城市 慕尼黑 成为 mnchen-3ya。

正如您在希腊语示例中可能注意到的那样,没有任何东西可以帮助解码器知道哪些 base-36 字符属于哪个原始 Unicode 符号。由于可变长度整数,每个有效数字都是可识别的,因为可以编码的数字存在阈值。有限状态机来救援。 RFC 给出了一些概述该算法的示例性伪代码。它非常聪明,利用了随着解码的进行而滚动的偏差。由于它总是在增加,因此它是一个具有一些巧妙属性的单调函数。

当然,为了防止常规 URL 被解释为 punycode,URL 有一个特殊的小前缀 xn-- 让浏览器知道这是一个代码。这包括所有 Unicode 字符,因此表情符号也有效。那你为什么不能去 xn--mnchen-3ya.de?如果您将其输入浏览器或单击链接,您可能会看到浏览器将令人困惑的字母汤转换为漂亮的 URL(并非所有浏览器都会这样做)。最大的问题是Unicode本身。

虽然 Unicode 提供了令人难以置信的支持,使网络上每天使用的数百种语言成为可能,但我们敢说,即使有些简单,也存在一些缺陷。西里尔字母、零宽度字母和其他 Unicode 怪异允许那些怀有更邪恶意图的人建立一个域名,在渲染时, 显示为知名网站。 SSL 证书有效,其他一切均已检查完毕。西里尔字母包含的字符在视觉上看起来与拉丁字母相同,但表示方式不同。黑客和网络钓鱼尝试的机会太大了,到目前为止,大多数域都不允许使用 punycode。

例如,您能区分这两个域之间的区别吗?

hackaday.com

hackday.com

有些浏览器会将悬停文本呈现为 Punycode,有些浏览器会将其保留为 UTF-8 等效形式。 “a”(U+0061) 已被西里尔字母“a”(U+0430) 取代,大多数计算机都使用完全相同的字符进行渲染。

这是一个 IDN 同形异义词攻击,他们依赖用户点击他们无法区分的链接。 2001 年,两名安全研究人员发表了一篇关于该主题的论文,用西里尔字母注册了“microsoft.com”作为概念证明。作为回应,建议顶级域仅接受包含拉丁字符和该国家/地区使用的语言字符的 Unicode 字符。因此,许多常见的美国顶级域名根本不接受 Unicode 域名。至少不可显示的字符是由 ICANN 专门划分的,这避免了一大堆蠕虫病毒,但视觉上相同但按位不同的字符会导致混乱。

然而,针对此类攻击的缓解措施正在慢慢推出。作为第一层保护,如果所有字符都来自同一语言,则 Firefox 和基于 Chromium 的浏览器仅显示非 Punycode 版本。某些浏览器将所有 Unicode URL 转换为 Punycode。其他技术使用光学字符识别 (OCR) 来确定 URL 是否可以进行不同的解释。在浏览器之外,通过短信或电子邮件发送的链接可能不具有相同的智能,并且只有在浏览器中打开它们后您才会知道。到那时,已经太晚了。

抛开挑战不谈,Punycodes 能获得成功吗? Hackaday 会获得 ☠️📅.com 吗?谁知道。但与此同时,我们可以享受 2003 年提出的巧妙解决方案,解决我们尚未完全解决的域名国际化这一棘手问题。

时间戳记:

更多来自 一日游