瀏覽器版本破百,“千年蟲”問題再現(xiàn)?
不知道有多少人還記得,在時間即將跨入 2000 年的時候,計算機領(lǐng)域曾發(fā)生過著名的“千年蟲”問題。
“千年蟲”不是病毒、也不是什么神奇生物,它只是計算機系統(tǒng)由于時間紊亂產(chǎn)生的一種 Bug:為了節(jié)省昂貴的存儲空間,上世紀(jì)的計算機系統(tǒng)人員通常會把年份只用后兩位數(shù)表示,所以等到 2000 年時,計算機無法識別這個“00”是 1900 年還是 2000 年,由此引發(fā)大范圍系統(tǒng)功能紊亂甚至崩潰。
本以為這個殺傷力極強的 Bug 不會再輕易出現(xiàn),不曾想在瀏覽器版本迭代中,也存在類似“千年蟲”的問題。
版本號首次突破個位數(shù),網(wǎng)站:“您的瀏覽器版本過低”
瀏覽器版本中的“千年蟲”不是時間問題,而是版本號位數(shù)的突破,因此最初出現(xiàn)這一問題時,是瀏覽器版本號由個位數(shù)升級至“10”的時候。
2009 年,Opera 瀏覽器首次更新至版本 10,就在用戶高高興興升級至最新版本后,訪問網(wǎng)站時卻被提醒道:“您的瀏覽器版本過低,請升級…”彼時,許多用戶第一反應(yīng):什么,難道已經(jīng)有 Opera 11 了?搜了搜,沒有啊!再去看看別的網(wǎng)站…嗯,倒是能訪問,但為啥有些功能突然不支持了,網(wǎng)站布局也有些錯位?
在眾多用戶向 Opera 提出投訴后,Opera 官方給出了解釋:這與 User-Agent 字符串有關(guān),而 Opera 10 是第一個突破十位數(shù)的版本號。
User-Agent,是 Http協(xié)議中的一部分,屬于頭域的組成部分,其中包括有關(guān)軟件的信息,例如瀏覽器名稱、版本號以及它使用的各種技術(shù)。當(dāng)有人訪問網(wǎng)站時,瀏覽器的 User-Agent 會與網(wǎng)頁請求一并發(fā)送,便于網(wǎng)站檢查訪問者的瀏覽器版本由此提供不同的響應(yīng)。
“根據(jù)之前瀏覽器版本的邏輯,我們在發(fā)布 Opera 10 alpha 版本時給了它一個 User-Agent 字符串:Opera/10.00 (Macintosh; Intel Mac OS X; U; en) Presto/2.2.0。但很快我們就發(fā)現(xiàn),很多為特定于版本提供不同內(nèi)容和腳本而部署了瀏覽器嗅探功能的網(wǎng)站,似乎不能很好地消化 User-Agent 中的‘Opera/10.00’部分?!監(jiān)pera 如此回應(yīng)道。
將 Opera 10 認(rèn)定為 Opera 1
在那個時期,瀏覽器尚未發(fā)展很長時間,多數(shù)瀏覽器的版本號一直保持在個位數(shù)以內(nèi),而Opera 10 是第一個版本號達到兩位數(shù)的瀏覽器。因此,相當(dāng)多的瀏覽器嗅探腳本似乎并沒有對這一變化做好準(zhǔn)備,仍習(xí)慣于僅檢測 User-Agent 字符串的第一個數(shù)字——也就是說,這些網(wǎng)站會錯誤地將 Opera 10 認(rèn)定為 Opera 1,從而將 Opera 10 識別為不支持的瀏覽器,從而破壞服務(wù)器以及客戶端腳本。
Opera 官方承認(rèn)了 Opera 10 在一些網(wǎng)站上存在 Bug:在部分網(wǎng)站上,F(xiàn)lash 視頻的位置處在預(yù)期高度的一半,因為 height 參數(shù)所依賴的瀏覽器嗅探腳本將 Opera 10 識別為 Opera 10 1,這就導(dǎo)致了該值不正確和錯亂布局。
這一問題很像當(dāng)年的“千年蟲”問題,因此在經(jīng)過幾個月對站點兼容性影響的仔細(xì)分析后,Opera 決定凍結(jié)字符串的第一部分“Opera/9.80”,并在最后添加版本號“Version/10.00”或“Version/11.00”等,以此在確保提供真實版本號的同時,避免因兩位數(shù)版本號引發(fā)的相關(guān)問題。作為參考,Mac 平臺下默認(rèn)英語的 Opera 10 User-Agent 如下:
Opera/9.80 (Macintosh; Intel Mac OS X; U; en) Presto/2.2.15 Version/10.00
在 Opera 官方 2009 年對此事的回應(yīng)中,就曾預(yù)言過:“其他瀏覽器也要注意這個問題,像 IE 距離版本 10 只差兩個版本(當(dāng)時 IE 瀏覽器更新至 IE 8),將來可能也會發(fā)生類似的問題?!?/p>
如 Opera 所料,三年后 Firefox 10 也遇到了相同問題:
梅開二度:Chrome、Firefox 版本即將破百
兩位數(shù)的版本號問題這十幾年來已完美解決,但與此同時各大瀏覽器也在快速發(fā)展,如今年 2 月,谷歌推出了 Chrome 98,隨后 Mozilla 也發(fā)布了 Firefox 97,二者版本號即將突破 100,那么歷史會再度重演嗎?
通過近來 Mozilla、谷歌消息顯示:會,但可能不會太嚴(yán)重。
自去年 8 月起,Mozilla 就已對三位數(shù)版本號的“Firefox/100”User-Agent 字符串進行測試,查看其是否會導(dǎo)致網(wǎng)站出現(xiàn)問題,谷歌也緊隨其后開始其 Chrome 100 的實驗。
結(jié)果他們在測試中發(fā)現(xiàn),果然有少數(shù)網(wǎng)站在解析瀏覽器三位數(shù)版本號的 User-Agent 字符串時出現(xiàn)錯誤,導(dǎo)致出現(xiàn)“網(wǎng)站聲明不支持瀏覽器”、“影響網(wǎng)站部分用戶界面”等問題,這些網(wǎng)站包括 HBO Go、Bethesda、Yahoo、Slack 及由 Duda 網(wǎng)站構(gòu)建器所創(chuàng)建的網(wǎng)站。
Mozilla 對此解釋道:“在沒有單一規(guī)范可遵循的情況下,不同的瀏覽器對 User-Agent 字符串和特定于站點的 User-Agent 解析具有不同的格式。有些解析庫可能存在硬編碼錯誤,沒有考慮到三位數(shù)的版本號。”
同時,Mozilla 還補充道,這次的影響范圍不會太嚴(yán)重:“當(dāng)初瀏覽器升級至兩位數(shù)版本號時,許多庫都改進了解析邏輯,因此預(yù)計這次版本號達到三位數(shù)所導(dǎo)致的問題會較少?!?/p>
網(wǎng)站開發(fā)者/管理員需自行檢測
據(jù)外媒 The Register 報道,谷歌計劃在今年 4 月初發(fā)布 Chrome 100,而 Firefox 100 預(yù)計將在 5 月發(fā)布。在此之前,Mozilla 和谷歌都將針對已發(fā)現(xiàn)的問題進行完善,如若屆時尚未完全修復(fù),兩家公司也已準(zhǔn)備好應(yīng)對措施:凍結(jié) User-Agent 中的“Firefox/99”或“Chrome/99”部分,在其他部分再附上實際版本。
但這只是應(yīng)急措施,不論 Mozilla 還是谷歌,都希望網(wǎng)站開發(fā)人員和管理員可以自行測試 Firefox 100 和 Chrome 100 的 User-Agent 是否會對其網(wǎng)站產(chǎn)生破壞。一旦發(fā)現(xiàn)問題,可在 webcompat.com 上提交報告。具體測試操作如下:
Firefox 100
1.打開 Firefox Nightly 的設(shè)置菜單。2.搜索“Firefox 100”,選中“Firefox 100 User-Agent String”選項。啟用后,F(xiàn)irefox 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.將選項設(shè)置為“啟用”。啟用后,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氪經(jīng)授權(quán)發(fā)布。
標(biāo)簽: