前几天 Hax 贺老在我博客挖坟,在《Webkit 下最无敌的跨大域方案》中留言说到「这个实际确实应该是安全 Bug(Chrome 的某个开发者也可能犯错误),而且后来被修了」。那篇文章写于三年半前,也该更新一下了。最近一连写了好多关于 HTTP 的文章,今天正好拿 Webkit 这个 Bug 换换口味。
先来回顾一下那篇文章中描述的 Bug:
Webkit 中,通过 document.domain,可以将 domain 设置到最后一级(最后一个点之后的内容)。由于域名最后实际上有一个 .(例如https://imququ.com.可以正常访问),所以甚至可以将 document.domain 设置为空字符串。
根据HTML5 文档的描述:在 JavaScript 中通过 document.domain 设置当前页面的 domain 时,如果新值不等于当前值,也不是 IPv4 和 IPv6 格式时,需要判断新值是否在 PSL(Public Suffix List,公共后缀列表)中,如果存在必须抛出 SecurityError,终止后续流程。
PSL 是由 Mozilla 创建的公共资源,官网是publicsuffix.org。它由两部分组成:一部分是由 ICANN(The Internet Corporation for Assigned Names and Numbers,互联网名称与数字地址分配机构)提供的 TLD(Top Level Domain,顶级域名)列表;一部分是由个人或机构提供的 PRIVATE 列表。完整的PSL可以从这个地址获得。
ICANN 维护的 TLD 列表好理解,例如最常见的 com、net、org 等等都属于这个列表。为大家所熟知的 TLD 最多也就几十个,那么完整的 TLD 列表包含多少记录呢?我统计了一下,截至到当前:
- TLD 列表中一共有7247
条记录; - 最长的记录有35
个字符,例如:posts-and-telecommunications.museum; - 级别最多的记录有4
级,例如:pvt.k12.ma.us;
PRIVATE 列表由个人或机构自行添加。例如我想把 imququ.com 的二级域名开放给其它人使用,同时还想让这些二级域名之间相互隔离,我可以申请在 PRIVATE 列表中加上 imququ.com。目前在 PRIVATE 列表中,有很多都是 Amazon Web Services 添加的,目的就是为了隔离用户。目前 PSL 中的 PRIVATE 记录统计如下:
- PRIVATE 列表一共有557
条记录; - 最长的记录有36
个字符,例如:ap-northeast-1.compute.amazonaws.com; - 级别最多的记录有5
级,例如:s3.cn-north-1.amazonaws.com.cn;
二者加起来,完整的 PSL 一共有7804
条记录。
PSL 做为公共资源,可以被用在很多场景上,例如 Firefox 用它在地址栏高亮 URL 的关键部分。PSL 更重要的用途是用在浏览器同源策略上:例如通过 document.cookie 设置 cookie,或者通过 document.domain 设置当前 domain,都不允许将 domain 设置为 PSL 中的记录。
Webkit 一直以来只在设置 cookie 时使用了 PSL,前面提到的 Chrome 的那个 Bug 纯属从 Webkit 继承而来。大约在两年前(详情),Chrome 解决了这个问题。以下分别是用最新的 Chrome、Firefox 以及 Microsoft Edge 的测试结果:
然而,Safari 至今为止依然没有修复这个问题,以下是在最新的 Safari 中的测试结果:
本文链接:https://imququ.com/post/domain-public-suffix-list.html,参与讨论
由 udpwork.com 聚合
|
评论: 0
|
要! 要! 即刻! Now!