1. 程式人生 > >域名小知識:Public Suffix List

域名小知識:Public Suffix List

提醒:本文最後更新於 1089 天前,文中所描述的資訊可能已發生改變,請謹慎使用。

前幾天 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 新增的,目的就是為了隔離使用者。

現在很多提供 App Engine 服務的廠商一般都會給使用者提供二級域名,例如 example.duapp.com,這會帶來很大的安全隱患:假如使用者將 document.domain 設定為大域;或者在設定 cookie 時指定 domain 為大域,都會導致網站完全暴露給其它二級域名使用者。那如果使用者在使用過程中避免了這些問題,是不是就高枕無憂了呢?也不是!其它使用者如果在大域寫入大量 Cookie,一樣可以對你的二級域名造成拒絕服務攻擊,想了解細節的同學請看這篇文章:超大 Cookie 拒絕服務攻擊

這也是為什麼亞馬遜要把那麼多 AWS 域名都加到 PSL 的 PRIVATE 列表中的原因。國內的服務商,我看到 Sina 的 SAE 也做了相關處理,這一點上 SAE 確實比較細緻。

目前 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 的測試結果:

top-level-domain-chrome

top-level-domain-firefox

top-level-domain-edge

然而,Safari 至今為止依然沒有修復這個問題,以下是在最新的 Safari 中的測試結果:

top-level-domain-safari

--EOF--

提醒:本文最後更新於 1089 天前,文中所描述的資訊可能已發生改變,請謹慎使用。