内容过滤

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

过滤网络请求

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

这些规则可以:

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

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

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

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

对于静态声明式网络请求规则,Chrome 有一个包含 30 万条规则的全局共享池,可供一组已安装的扩展程序共同使用。此外,还保证每个扩展程序最多可以创建 30, 000 条静态规则。例如,如果用户只安装了一个内容过滤扩展程序,则该扩展程序最多可以使用 330,000 条静态声明式网络请求规则。为便于您了解规则的数量,大多数广告拦截器常用的 EasyList 过滤器列表都包含大约 35,000 条网络规则。

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

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

部分规则不能与扩展程序捆绑在一起。相反,扩展程序需要在运行时添加它们。这些规则称为“动态规则”。

对于动态声明式网络请求规则,Chrome 允许每个扩展程序最多 30,000 条安全动态规则。大多数规则都被视为安全规则:blockallowallowAllRequestsupgradeScheme。即使某条规则被视为不安全的规则(例如 redirect),仍然可以动态添加,但最大数量上限为 5,000 条,同时也会计入 30,000 条动态规则数量上限。更确切地说,在简易列表过滤条件列表中,有 98-99% 的规则都是安全规则

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

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

广告生态系统在不断变化,内容过滤器也需要随之更新。通过结合使用 chrome.webRequest 和动态声明式网络请求规则,可以分析网络请求是否存在可能侵犯隐私权的行为,并在日后屏蔽此类请求。

基本方法是:

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

这种方法的优势在于,分析过程是异步进行的,不会对网站性能产生负面影响。

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

您可以在扩展程序中提供过滤器配置界面,让用户自行定义内容过滤规则。将这些用户定义的规则转换为声明式网络请求规则,并将它们添加为动态规则。这些规则在浏览器会话和扩展程序升级之间保持不变,仍可供用户使用。使用此方法,用户最多可以添加 3 万条自定义规则。

过滤网页上的元素

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

这可以通过内容脚本来实现。内容脚本在网页环境中运行,可以使用 DOM 对网页进行更改。

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

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

企业和教育用例通常对内容和网络过滤有极其严格的要求,例如根据内容过滤请求。为了启用这些用例,已安装政策的扩展程序提供了一种额外的方法来过滤和屏蔽网络请求。对 webRequest API 中的事件使用“屏蔽”选项时,可以实现一个程序化内容过滤器,以便针对每个请求执行自定义逻辑,以决定是否应屏蔽某个请求。这仅限于通过政策安装的扩展程序,因为这些扩展程序具有较高的信任级别。

拦截导航请求

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