浏览器扩展是什么?
浏览器扩展是奇特且强大的“寄生者”。之所以称其为“寄生者”,是因为它们在软件世界的一个不寻常角落中生存:它们运行于网页之上,却又完全独立于任何网站或服务器。浏览器扩展之所以强大,是因为它们被赋予了不同寻常的权限:一些浏览器扩展可以查看并修改您在浏览器中看到的一切,一些可以查看您的浏览器发送的每个HTTP请求,还有一些可以管理您的数字货币钱包。浏览器扩展之所以奇特,是因为它们可以直接与支持它们的公司对抗:例如uBlock Origin,这款最受欢迎的谷歌Chrome扩展之一,其唯一存在目的就是阻止显示构成谷歌主要收入来源的广告。
尽管浏览器扩展可能既奇特又强大,但它们无疑是一种有用的工具。它们赋予了终端用户一种对网页浏览体验的控制权,而这种控制权通过其他方式是无法获得的。最受欢迎的浏览器扩展拥有数千万次安装量,截至2022年,Chrome网上应用店已发布超过18万种扩展。鉴于其广泛的采用率和实用性,万维网联盟(W3C)于2021年成立了WebExtensions社区小组,以“探索浏览器供应商和其他相关方如何携手合作,共同推动通用浏览器扩展平台的发展”。
无论浏览器扩展的未来如何,它们似乎都不会在短时间内消失。
浏览器扩展的历史
就像进化生物学家通过研究过渡化石来了解现代生命形态一样,我们也可以通过研究软件先驱来更好地理解浏览器扩展。
使用插件定制软件
插件的概念最早出现在20世纪70年代的UNIVAC Series 90大型计算机上。插件是软件组件,旨在改变现有计算机程序的行为。在该大型计算机的Unisys VS/9操作系统上运行的文本编辑器EDT允许其他程序“插入”并访问其内存缓冲区。此外,这些插件还可以向EDT发送命令以进行处理。有了这些功能,插件程序就能够以编程方式改变其他程序的执行流程或调用文本编辑器中的命令,而这些任务通常需要通过用户的直接输入来完成。
网络浏览器的历史
网络浏览器行为的基本原理极大地推动了互联网的迅速普及。与分发难以检查或更改的可执行文件(即二进制程序)的传统软件交付模型不同,通过HTTP传输的软件是开源的。任何收到HTML页面的人都可以对其为所欲为:查看源代码、修改现有内容和样式,或者复制并重新用于自己的需求。由于可以轻松逆向工程出网站如何实现某项功能,因此好的想法能够迅速传播。
1995年发布的JavaScript延续了这一理念。由于JavaScript是一种解释型语言,因此通过HTTP传输到浏览器的脚本是开源的。此外,JavaScript的有用性部分归功于文档对象模型(DOM),它允许脚本使用应用程序编程接口(API)以编程方式检查和修改浏览器向用户显示的内容。即使数十年后的今天,这一事实依然成立:世界上任何一个网页都可以通过相同的浏览器API集使用JavaScript进行检查和修改。
原生浏览器插件
在JavaScript逐渐崭露头角的同时,软件公司也在推出新的软件运行方式,让软件可以在浏览器中运行。这些软件以“浏览器插件”的形式出现,它们是闭源模块,能够在浏览器内从主机计算机上本地运行程序。这类插件的例子包括Java小程序、Adobe Flash、Microsoft Silverlight和ActiveX、以及Apple QuickTime。当时的JavaScript速度较慢且功能有限,因此将计算任务卸载到主机系统允许浏览器利用更多的系统内存、持久存储和图形API,而这些通常是受限的。因为这些插件存在于完全不同的执行上下文中,所以它们在很大程度上与周围的网页隔离开来。
这些插件是出于必要而采用的,但它们存在很多问题。插件的安装和使用都很笨拙,而且由于它们被授予访问主机系统的特权,因此引入了许多浏览器漏洞和安全隐患。随着浏览器在HTML5、CSS3和更全面的ECMAScript规范方面的能力越来越强,这些插件的作用越来越小,因此现代浏览器几乎已经完全放弃了对它们的支持。
从浏览器附加组件到扩展
早在1999年,Internet Explorer和Firefox就支持能够自定义浏览器的“附加组件”,但这些附加组件使用了专有集成,因此仅限于单个浏览器,并且只能使用该供应商的附加组件API。直到2009年9月,Google Chrome才推出了第一批现代浏览器扩展。与其他浏览器的附加组件不同,这些Chrome扩展可以使用HTML、CSS和JavaScript构建。它们使用JavaScript扩展API与浏览器进行交互,开发人员可以将其扩展发布到Chrome网上应用商店。
截至2012年6月,Chrome超越Internet Explorer成为最受欢迎的网页浏览器,Chrome网上应用商店的总安装量达到7.5亿次。在接下来的几年里,竞争对手的浏览器开始逐步采用Google Chrome开创的API和扩展模型。
浏览器扩展领域现状
经过多年的试验和错误,今天的浏览器扩展已经成为一种成熟的软件产品。它们受到开发者和消费者的广泛采用,拥有定义明确的API和文档,并且可以通过强大的应用商店管道轻松触达最终用户。在本节中,我们将探讨如何思考浏览器扩展、用户去哪里安装它们以及浏览器扩展的不同类别。
比较移动应用和浏览器扩展
在许多方面,现代浏览器扩展类似于移动应用。它们都明确声明需要从主机系统获得的权限,受到定义明确的安全模型的限制,并且利用广泛的API集合与主机进行交互。它们都被打包成发行版并通过特定于供应商的应用商店进行部署。移动应用和浏览器扩展的发行版都经过审查流程,并且更新会自动通过主机系统下载和安装。
然而,移动应用通常作为独立的用户界面存在,而扩展通常是为了在一个或多个网页上运行而构建的,具有补充性的用户界面。与移动应用不同,浏览器扩展不一定具有用户界面;许多流行的浏览器扩展只不过是一段在后台运行的JavaScript代码,用于在某些事件发生时执行处理程序。
浏览器扩展商店
所有主流浏览器都提供扩展商店,用户可以在其中发布和下载扩展:
- 谷歌Chrome扩展可以从Chrome网上应用商店(https://chrome.google.com/webstore) 安装。这个扩展商店是规模最大、最受欢迎的。
- Safari扩展只能从Apple App Store下载。
- Mozilla Firefox扩展可以从附加组件市场(https://addons.mozilla.org/) 安装。值得注意的是,Firefox是唯一允许扩展在桌面和移动设备上使用的浏览器。
- Microsoft Edge扩展可以从Edge附加组件市场(https://microsoftedge.microsoft.com/addons/Microsoft-Edge-Extensions-Home) 安装。Edge浏览器最近采用了Chromium渲染引擎,这意味着通过启用“允许来自其他商店的扩展”设置,Chrome网上应用商店的扩展可以在Edge浏览器中安装。
- Opera扩展可以从Opera附加组件市场(https://addons.opera.com/) 下载。与Edge浏览器一样,Opera也是基于Chromium的浏览器,可以配置为从Chrome网上应用商店安装扩展。
浏览器扩展类型
由于拥有广泛的API资源,开发者能够构建出能够执行各种任务的浏览器扩展。然而,正如Unix程序应该“只做一件事,并把它做好”一样,浏览器扩展通常也倾向于在其职责范围内更加小巧、更有针对性。
广告和跟踪拦截器
广告和跟踪拦截器无疑是最常见的扩展类型,其目的非常简单:拦截不需要的内容。现代网页由一系列对单个内容项的请求组成。其中大部分请求是为了获取渲染页面所需的基本内容,如CSS和JavaScript,但也有很多请求是为了获取渲染广告、收集分析数据或跟踪用户的脚本。
这些拦截扩展采用的核心策略非常简单。安装后,拦截扩展会被授予检查和管理页面发出的所有HTTP请求的能力。此外,扩展还附带了一个已知的提供广告或跟踪内容的URL域名和正则表达式的列表。每当页面发出请求时,扩展都会将其与列表进行比对,如果匹配成功,则终止该请求。
从页面的角度来看,请求似乎只是失败了——在向远程资源发送请求时,这是完全正常且预期之内的情况。从用户的角度来看,网页通常会正确渲染,只有广告和跟踪脚本被剔除。从广告或跟踪服务器的角度来看,它们根本不知道用户访问过该页面,因为发出的请求从未到达服务器。
当然,这类扩展对于依赖被拦截内容来生成信息或收入的实体来说是有问题的。作为回应,广告和跟踪行业已经开始推出反制措施,以应对拦截扩展的广泛使用。现在,有些页面只有在广告和跟踪脚本加载时才会渲染其内容;它们认为请求失败总是因为拦截扩展终止了请求。一些广告和跟踪服务器使用“CNAME伪装”来提供其脚本,其中广告或跟踪脚本请求假装是从页面域名加载的常规内容。此外,Google Chrome利用其庞大的扩展市场份额,推动向新的清单格式(manifest v3)过渡,该格式将极大地削弱扩展有效拦截广告和跟踪请求的能力。
注意:扩展用于管理网络请求的高级应用程序编程接口(APIs)将在“网络”章节中详细介绍。关于向manifest v3过渡的深入讨论,请参阅“扩展清单”章节。
密码管理器
扩展可以管理一个与任何网页完全隔离的JavaScript执行环境。这个沙盒环境非常适合加载和存储秘密信息,并可以根据需要将信息安全地传递给网页或从网页接收。密码管理器利用这一点来记录用户名/密码组合,将它们保存在本地或远程服务器上,并为用户自动输入。
密码管理器扩展允许用户在沙盒扩展界面内登录密码管理器服务。一旦通过身份验证,它们将从远程服务器加载用户的加密密码,并在本地进行解密。现在密码已加载到内存中,扩展管理器将被授予权限,以有效管理用户的密码:
- 查看和管理页面文档对象模型(DOM),以自动检测用户名和密码输入,输入用户名和密码,并在页面上呈现额外内容以管理用户凭据
- 查看和管理外发请求,以自动检测包含用户凭据的请求
使用密码管理器最重要的方面可能是其固有的能力,即几乎可以完全防止任何网络钓鱼尝试。密码管理器可以准确地将用户的凭据与应使用的域名相关联。例如,用户在realsite.com上的凭据只有在浏览器位于realsite.com时才应被填写。假设用户收到一封网络钓鱼邮件,并被诱骗点击一个链接,将其带到fakesite.com(假装是realsite.com)。尽管fakesite.com在用户看来可能与realsite.com完全相同,但密码管理器扩展会看到URL不是realsite.com,并拒绝填写凭据。当然,这并不能阻止用户手动输入密码,但URL匹配功能仍然是防御此类攻击的一个有力手段。
智能写作管理工具
扩展可以被授予对页面DOM的完全访问权限,因此它们能够查看和管理页面内容,包括文本输入及其文本内容。监听键盘事件和点击的浏览器扩展可以实时获取用户正在输入的确切内容。这些文本内容可以被传输到任何数量的文本管理工具中,如拼写检查器、语法检查器和智能写作助手。然后,这些扩展可以对文本进行样式设置,并在页面中插入弹出框,为用户提供按需交互式界面,以便与实际HTML输入字段一起管理智能文本管理工具。
无障碍工具
在互联网上消费内容的主要方式是文本,但并不是每个人都能轻松地在电脑屏幕上阅读。就像智能写作管理扩展可以读取和更改输入文本一样,无障碍扩展可以获取现有页面文本,并以一种对用户更加友好的方式对其进行格式化。这可以表现为自动翻译页面文本、将页面文本传输到屏幕阅读软件、重新格式化页面文本以提高可读性(通过增大字体、提高对比度或选择替代字体),或提供快速访问字典的功能。
内容和链接聚合器
许多网络用户发现他们需要快速且方便地保存网页的URL或这些网页的部分内容。聚合器扩展可以添加一个用户界面,以便快速捕获URL或页面HTML的部分内容,并将其保存在本地或第三方服务器上。扩展还可以访问书签API,从而允许它们查看和管理浏览器的书签站点。
标签管理工具
浏览器扩展可以访问广泛的标签管理API,允许它们执行一系列以标签为中心的操作,否则这些操作需要用户直接完成。自定义新标签行为、重新排序现有标签、丢弃过时的标签以及快速访问常用标签只是这类扩展提供的部分功能。
屏幕录制工具
浏览器扩展不仅能够查看页面文档对象模型(DOM),还能够利用HTML5 API来直观查看浏览器页面的外观。这对于屏幕录制、屏幕共享和捕获截图等工具非常有用。
注意事项:使用这些HTML5 API的扩展仍然需要用户明确授权。例如,屏幕捕获API在浏览器扩展请求时仍会生成一个浏览器对话框,要求用户授予访问权限。
软件平台集成
许多拥有公开API的软件平台都发布了可以直接连接到该API的浏览器扩展。当用户正在查看的网页内容被发送到这些API时,这尤其有用。浏览器扩展通过紧密集成网页,以多种方式改善用户体验,例如将内容发送到远程文件存储、自动化访问用户的日历以及访问第三方记笔记API。
数字货币钱包
随着数字货币世界的日益流行,用户必须管理支付的新方式也随之出现。尽管平台和货币的细节各不相同,但数字货币用户必须执行的任务通常属于以下类别之一:
- 读取长字符串:用户必须读取呈现给他们的长字符串,这可能是他们希望发送资金或接收资金的加密货币地址。这些字符串通常是几十个随机字符,因此无误地键入或写下它们是不切实际的。
- 与平台握手:用户必须与平台进行握手。这涉及的技术形式不同,但数字货币平台通常会支持某种形式的“连接”到用户的钱包,从而允许发送支付或签署或明确授权操作。
浏览器扩展非常适合这两项任务。其自动读取页面内容的能力意味着长字符字符串的管理变得轻而易举。此外,其独立的执行环境对于开发人员来说是托管数字货币钱包的安全场所。
开发工具
如果没有开发者浏览器扩展,现代Web开发将无法实现。在Web早期,开发人员迫切希望找到更容易调试他们正在开发的网站的方法。最早的解决方案之一是2006年发布的名为Firebug的Firefox插件,它允许开发人员查看并拆分他们当前正在查看的网页,这极大地简化了HTML、JavaScript和CSS的调试过程,如果没有该插件,调试过程将变得一团糟,需要使用打印语句和查看原始页面源代码的组合来进行。
浏览器很快意识到,市场对这类工具的需求巨大,于是开始推出与Firebug功能集相匹配的原生调试器版本。随着Firebug变得多余,该扩展于2017年停止运行。
随着React等单页应用程序(SPA)的大规模采用,对开发者工具的需求也随之而来。原生浏览器调试器并不适合调试这类应用程序,因为控制页面渲染的逻辑和架构被封装在难以调试的第三方JavaScript代码大块中。
为了解决这个问题,许多从事单页应用程序框架开发的团队也发布了配套的浏览器扩展。该浏览器扩展非常熟悉特定单页应用程序的内部行为,并配备了广泛的工具包,允许开发人员深入了解框架并理解其工作原理。这为开发人员提供了对页面上正在发生的事情的更深入了解,更重要的是,还提供了如何修复问题的方法。
此外,浏览器扩展已经发展到可以直接集成到浏览器的开发者工具中。扩展可以将自定义的devtools页面插入到浏览器的调试界面中,与被检查的页面进行交互,并调试网络请求。它们还可以访问自定义的DevTools API。图1-3展示了嵌入在浏览器开发者工具中的React Developer Tools用户界面。
这意味着开发者现在可以在浏览器的原生开发环境中直接使用这些扩展,而无需切换到其他应用或工具。这种集成提高了工作效率,使得开发者能够更快速、更便捷地解决在开发过程中遇到的问题。通过访问自定义的DevTools API,这些扩展还能够提供更丰富、更强大的功能,进一步增强了开发者在调试和优化Web应用时的能力。
总结
浏览器扩展已悄然成为现代计算不可或缺的重要组成部分。从大型主机计算机的朴素起源,经过数十年的发展,它们已演变成现代浏览器的多功能“瑞士军刀”。
浏览器扩展的强大功能在其所启用的广泛工具中得到了充分体现。从强大的安全和隐私工具(如广告拦截器和密码管理器),到用于浏览器内写作的整套工具,再到一系列单页应用程序开发工具,浏览器扩展使得现代网络体验更加丰富和完善,这超出了大多数人的想象。
下一章将探讨构成浏览器扩展的所有不同组件。