内容过滤

您可以通过多种方式在 Chrome 扩展程序中实现内容和网络过滤。本指南概述了扩展程序可用的内容过滤功能,以及 Chrome 扩展程序可使用的不同过滤方法、技术和 API。

过滤网络请求

在 Chrome 扩展程序中过滤网络请求的主要方法是使用 chrome.declarativeNetRequest API。借助声明性网络请求,开发者可以通过指定声明性规则来屏蔽或修改网络请求。声明性网络请求规则格式基于大多数广告拦截器使用的过滤列表语法的功能。

这些规则能够:

  • 屏蔽网络请求。
  • 将网址协议升级为安全协议(将 http 升级为 https 或将 ws 升级为 wss)。
  • 重定向网络请求。
  • 修改请求或响应标头。

Chrome 支持与扩展程序捆绑的规则,以及动态更新的规则(例如响应远程配置或用户输入的规则)。

将过滤规则与扩展程序捆绑在一起

扩展程序软件包中包含的规则称为“静态规则”。当扩展程序安装或升级时,这些规则也会随之安装和更新。Chrome 会限制扩展程序可声明的静态规则数量。

对于静态声明性网络请求规则,Chrome 有一个全局共享的 30 万条规则池,已安装的扩展程序集可以共同使用这些规则。此外,每个扩展程序都保证有 30, 000 条静态规则的许可。例如,如果用户仅安装了一个内容过滤扩展程序,则该扩展程序最多可以使用 33 万条静态声明性网络请求规则。为了让您了解这相当于多少条规则,我们举个例子:大多数广告拦截器使用的热门 EasyList 过滤规则列表包含大约 35,000 条网络规则。

静态声明性网络请求规则可以整理到不同的规则集中。扩展程序最多可以指定 100 个静态规则集,并且一次最多可以启用 50 个规则集。

在运行时动态添加过滤规则

某些规则无法与扩展程序捆绑。相反,扩展程序需要在运行时添加它们。这些规则称为“动态规则”。

对于动态声明性 Net Request 规则,Chrome 允许每个扩展程序最多有 30,000 条安全动态规则。大多数规则都被视为安全规则:blockallowallowAllRequestsupgradeScheme。即使规则被认为不安全(例如 redirect),仍可以动态添加,但上限较低,为 5,000,并且也计入 30,000 条动态规则的限制。为了让您对这一点有直观的了解,easylist 过滤列表中的 98-99% 的规则都是安全规则

内容过滤扩展程序可以分别使用静态规则和动态规则,将已知的过滤规则与扩展程序捆绑在一起,并在需要时从其服务器更新扩展程序中的新内容过滤规则。

根据观察到的请求调整规则

广告生态系统在不断发展演进,因此需要相应地更新内容过滤条件。通过将 chrome.webRequest 与动态声明性网络请求规则相结合,可以分析网络请求是否存在潜在的隐私权违规行为,并在未来阻止这些请求。

基本方法如下:

  1. 使用 chrome.webRequest API 分析 Web 请求,并尝试自动识别不符合隐私权要求的请求,例如使用机器学习。
  2. 为在第 2 步中发现的每个请求创建动态声明性 Net 请求规则,以便日后屏蔽类似请求。
  3. (可选)将已识别的声明性网络请求规则发送回您的服务器,以便在下次更新扩展程序时将其添加为静态声明性网络请求规则。

此方法的优点是分析是异步进行的,不会对网站性能产生负面影响。

允许用户定义自己的过滤规则

您可以在扩展程序中提供过滤条件配置界面,让用户定义自己的内容过滤规则。将这些用户定义的规则转换为声明性网络请求规则,并将其添加为动态规则。这些规则将继续供用户使用,因为它们会保留在浏览器会话和扩展程序升级中。使用此方法,用户最多可以添加 30,000 条自定义规则。

过滤网页上的元素

过滤网络请求只是内容过滤的一个重要方面。另一项重要功能是直接从网页中移除不需要的内容。例如,超过 40% 的 easylist 过滤规则列表定义了客户端应如何隐藏网页元素。

这可以使用内容脚本来实现。内容脚本在网页的上下文中运行,可以使用 DOM 对网页进行更改。

Chrome 扩展程序不得执行远程托管的代码。不过,来自服务器的有关要隐藏哪些元素的数据不受影响,因为这些数据被视为配置数据,因此可以在运行时根据需要更新元素规则。

过滤已安装政策的扩展程序中的网络请求

企业和教育应用场景通常对内容和网络过滤有极其严格的要求,例如根据内容过滤请求。为了实现这些用例,已安装政策的扩展程序可以通过其他方式过滤和阻止网络请求。通过在 webRequest API 中将“阻塞”选项与事件搭配使用,可以实现一个程序化内容过滤条件,该过滤条件可针对每个请求执行自定义逻辑,以决定是否应阻止相应请求。此功能仅限于政策安装的扩展程序,因为这些扩展程序具有更高的信任级别。

拦截导航请求

可以使用声明性网络请求规则过滤导航请求。例如,您可能希望绕过将用户重定向到其预期目的地的跟踪网址。一种处理方法是将导航请求 https://tracker.com?redirect=https%3A%2F%2Fexample.com 重定向到扩展程序页面(需要配置为可供网页访问的资源),然后该页面将运行脚本来提取重定向目标,并使用 window.location.replace("https://example.com") 重定向到目标位置,从而绕过链接跟踪器。