瀏覽器版本破百,“千年蟲”問題再現?

不知道有多少人還記得,在時間即將跨入 2000 年的時候,計算機領域曾發生過著名的“千年蟲”問題。

“千年蟲”不是病毒、也不是什麼神奇生物,它只是計算機系統由於時間紊亂產生的一種 Bug:為了節省昂貴的存儲空間,上世紀的計算機系統人員通常會把年份只用後兩位數表示,所以等到 2000 年時,計算機無法識別這個“00”是 1900 年還是 2000 年,由此引發大范圍系統功能紊亂甚至崩潰。

本以為這個殺傷力極強的 Bug 不會再輕易出現,不曾想在瀏覽器版本迭代中,也存在類似“千年蟲”的問題。

版本號首次突破個位數,網站:“您的瀏覽器版本過低”

瀏覽器版本中的“千年蟲”不是時間問題,而是版本號位數的突破,因此最初出現這一問題時,是瀏覽器版本號由個位數升級至“10”的時候。

2009 年,Opera 瀏覽器首次更新至版本 10,就在用戶高高興興升級至最新版本後,訪問網站時卻被提醒道:“您的瀏覽器版本過低,請升級…”彼時,許多用戶第一反應:什麼,難道已經有 Opera 11 了?搜了搜,沒有啊!再去看看別的網站…嗯,倒是能訪問,但為啥有些功能突然不支持了,網站佈局也有些錯位?

在眾多用戶向 Opera 提出投訴後,Opera 官方給出了解釋:這與 User-Agent 字符串有關,而 Opera 10 是第一個突破十位數的版本號。

User-Agent,是 Http協議中的一部分,屬於頭域的組成部分,其中包括有關軟件的信息,例如瀏覽器名稱、版本號以及它使用的各種技術。當有人訪問網站時,瀏覽器的 User-Agent 會與網頁請求一並發送,便於網站檢查訪問者的瀏覽器版本由此提供不同的響應。

“根據之前瀏覽器版本的邏輯,我們在發布 Opera 10 alpha 版本時給了它一個 User-Agent 字符串:Opera/10.00 (Macintosh; Intel Mac OS X; U; en) Presto/2.2.0。但很快我們就發現,很多為特定於版本提供不同內容和腳本而部署了瀏覽器嗅探功能的網站,似乎不能很好地消化 User-Agent 中的‘Opera/10.00’部分。”Opera 如此回應道。

將 Opera 10 認定為 Opera 1

在那個時期,瀏覽器尚未發展很長時間,多數瀏覽器的版本號一直保持在個位數以內,而Opera 10 是第一個版本號達到兩位數的瀏覽器。因此,相當多的瀏覽器嗅探腳本似乎並沒有對這一變化做好準備,仍習慣於僅檢測 User-Agent 字符串的第一個數字——也就是說,這些網站會錯誤地將 Opera 10 認定為 Opera 1,從而將 Opera 10 識別為不支持的瀏覽器,從而破壞服務器以及客戶端腳本。

Opera 官方承認了 Opera 10 在一些網站上存在 Bug:在部分網站上,Flash 視頻的位置處在預期高度的一半,因為 height 參數所依賴的瀏覽器嗅探腳本將 Opera 10 識別為 Opera 10 1,這就導致了該值不正確和錯亂佈局。

這一問題很像當年的“千年蟲”問題,因此在經過幾個月對站點兼容性影響的仔細分析後,Opera 決定凍結字符串的第一部分“Opera/9.80”,並在最後添加版本號“Version/10.00”或“Version/11.00”等,以此在確保提供真實版本號的同時,避免因兩位數版本號引發的相關問題。作為參考,Mac 平台下默認英語的 Opera 10 User-Agent 如下:

Opera/9.80 (Macintosh; Intel Mac OS X; U; en) Presto/2.2.15 Version/10.00

在 Opera 官方 2009 年對此事的回應中,就曾預言過:“其他瀏覽器也要注意這個問題,像 IE 距離版本 10 只差兩個版本(當時 IE 瀏覽器更新至 IE 8),將來可能也會發生類似的問題。”

如 Opera 所料,三年後 Firefox 10 也遇到了相同問題:

梅開二度:Chrome、Firefox 版本即將破百

兩位數的版本號問題這十幾年來已完美解決,但與此同時各大瀏覽器也在快速發展,如今年 2 月,谷歌推出了 Chrome 98,隨後 Mozilla 也發布了 Firefox 97,二者版本號即將突破 100,那麼歷史會再度重演嗎?

通過近來 Mozilla、谷歌消息顯示:會,但可能不會太嚴重。

自去年 8 月起,Mozilla 就已對三位數版本號的“Firefox/100”User-Agent 字符串進行測試,查看其是否會導致網站出現問題,谷歌也緊隨其後開始其 Chrome 100 的實驗。

結果他們在測試中發現,果然有少數網站在解析瀏覽器三位數版本號的 User-Agent 字符串時出現錯誤,導致出現“網站聲明不支持瀏覽器”、“影響網站部分用戶界面”等問題,這些網站包括 HBO Go、Bethesda、Yahoo、Slack 及由 Duda 網站構建器所創建的網站。

Mozilla 對此解釋道:“在沒有單一規范可遵循的情況下,不同的瀏覽器對 User-Agent 字符串和特定於站點的 User-Agent 解析具有不同的格式。有些解析庫可能存在硬編碼錯誤,沒有考慮到三位數的版本號。”

同時,Mozilla 還補充道,這次的影響范圍不會太嚴重:“當初瀏覽器升級至兩位數版本號時,許多庫都改進瞭解析邏輯,因此預計這次版本號達到三位數所導致的問題會較少。”

網站開發者/管理員需自行檢測

據外媒 The Register 報道,谷歌計劃在今年 4 月初發布 Chrome 100,而 Firefox 100 預計將在 5 月發布。在此之前,Mozilla 和谷歌都將針對已發現的問題進行完善,如若屆時尚未完全修復,兩家公司也已准備好應對措施:凍結 User-Agent 中的“Firefox/99”或“Chrome/99”部分,在其他部分再附上實際版本。

但這只是應急措施,不論 Mozilla 還是谷歌,都希望網站開發人員和管理員可以自行測試 Firefox 100 和 Chrome 100 的 User-Agent 是否會對其網站產生破壞。一旦發現問題,可在 webcompat.com 上提交報告。具體測試操作如下:

Firefox 100

1.打開 Firefox Nightly 的設置菜單。2.搜索“Firefox 100”,選中“Firefox 100 User-Agent String”選項。啟用後,Firefox User-Agent 字符串將更改為:

Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:100.0) Gecko/20100101 Firefox/100.0

Chrome 100

1.訪問 chrome://flags/#force-major-version-to-100

2.將選項設置為“啟用”。啟用後,Chrome User-Agent字符串將更改為:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4758.102 Safari/537.36

參考鏈接:

https://www.bleepingcomputer.com/news/software/mozilla-warns-chrome-firefox-100-user-agents-may-break-sites/

https://www.theregister.com/2022/02/17/browsers_version_100_websites_bug/

https://maqentaer.com/devopera-static-backup/http/dev.opera.com/articles/view/opera-ua-string-changes/index.html

本文來自微信公眾號 “CSDN”(ID:CSDNnews),作者:鄭麗媛,36氪經授權發布。

本文經授權發布,不代表36氪立場。

如若轉載請註明出處。來源出處:36氪