不知道有多少人还记得,在时间即将跨入 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 是第一个版本号达到两位数的浏览器。因此,相当多的浏览器嗅探脚本似乎并没有对这一变化做好准备,仍习惯于仅检测 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 也遇到了相同问题:
两位数的版本号问题这十几年来已完美解决,但与此同时各大浏览器也在快速发展,如今年 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
《新程序员003》正式上市,50余位技术专家共同创作,云原生和数字化的开发者们的一本技术精选图书。内容既有发展趋势及方法论结构,华为、阿里、字节跳动、网易、快手、微软、亚马逊、英特尔、西门子、施耐德等30多家知名公司云原生和数字化一手实战经验!
☞“开源和商业化不能形成对立!”
☞曾被“霸凌”的两个孩子:电动汽车与分布式数据库