自定义过滤器和快速修复过滤器去哪了?MV3 政策的影响
“自定义过滤器不见了?快速修复过滤器发生了什么?”
由于 Chrome 在 Manifest V3 下实施了严格的远程执行政策 ,我们不得不做出艰难决定:「自定义过滤器」暂时下线,「快速修复过滤器」永久移除。
为什么?原因是,Chrome 禁止注入脚本或使用远程托管代码。尽管此政策的出发点是增强安全性,但措辞过于宽泛,导致连广告拦截规则也受限。因此,「自定义过滤器」和「快速修复过滤器」也被迫移除。
为什么这是个问题?
首先,「快速修复过滤器」原本是 MV3 限制下的临时解决方案。
在 MV3 中,所有 AdGuard 过滤器都内置在扩展程序内,意味着更新只能通过 Chrome 商店审核的完整版本发布。这通常需要数天,导致用户在网站出现问题时只能等待修复,非常不便。
在 MV2 时代,我们通过增量更新实现了快速更新,无需完整扩展更新。但 MV3 不再允许这种方式,因此我们开发了「快速修复过滤器」作为替代方案,以便能即时推送修复规则。
然而,即使我们尽力配合 Chrome 政策(具体过程详见下文),最终还是不得不将其彻底移除。这是一个重大损失。
其次,「自定义过滤器」的消失影响更大。
「自定义过滤器」允许用户通过 URL 添加第三方过滤规则,依赖全球志愿者的维护,对广告拦截生态至关重要。我们的内置过滤器无法覆盖所有需求,而「自定义过滤器」让用户能够灵活调整规则,测试和分发自定义规则。
失去「自定义过滤器」不仅会影响用户体验,也削弱整个广告拦截社区的创新能力。正如我们在先前的 MV3 相关文章中所说:“真正的受害者是过滤规则开发者。”。
我们的解决方案
为了在符合 Chrome 政策的同时保持扩展的实用性,我们会采取以下措施:
- 将恢复「自定义过滤器」。我们将使用
userScripts
API 来实现符合 MV3 规则的自定义脚本执行。
但有一个问题:用户需要手动开启「开发者模式」才能使用,这对部分用户来说可能较复杂。因此,在发布支持「自定义过滤器」的版本后,我们会提供详细的操作指南。
- 替代「快速修复过滤器」。我们将采用 Chrome 的快速审核流程,以便更频繁地更新过滤规则,而无需完整审核。但此方法也有局限,仅适用于 DNR 规则集和安全规则的更新。
未来,我们的扩展将采用两种更新方式。快速更新:每隔几小时自动推送规则更新,无需完整审核。完整更新:仍需通过 Chrome 应用商店的审核。
从最初的尝试到最终找到这套折衷方案,我们经历了漫长的调整过程。下方时间轴详细记录了我们如何在遵守 Chrome 政策的同时,尽可能保留广告拦截的灵活性。
我们与 Chrome 政策的“斗争”时间线
- 第一次拒审:远程脚本执行
我们的提交因使用 <script> 标签应用规则而被拒。确实,我们的扩展原本通过 <script> 标签从规则中提取脚本并将其应用到网页。但在 MV3 中,内容安全策略(CSP)比 MV2 更严格,无法直接注入脚本规则,这大大限制了开发者修改网页内容的工具。因此,在某些情况下,我们不得不增强 <script> 标签的注入方式,而这成为了问题。
我们的应对方案:
我们借鉴了在 Firefox 上使用的方案:将脚本规则转换为存储在扩展程序中的本地 JavaScript 函数,以避免 <script> 标签的使用。此外,我们增加了检查机制,确保执行的脚本仅来自内置规则。
然而,对于「用户规则」、「自定义过滤器」和「快速修复过滤器」,我们仍然使用 <script> 进行注入。
这个版本的扩展… 没有通过审核。
- 第二次拒审:快速修复过滤器的下载
这次,Chrome 认为「快速修复过滤器」的远程下载机制违反了远程执行政策。
我们的应对方案:
我们详细解释了快速修复过滤器的目的,并说明它如何在不违反政策的情况下,解决 MV3 的局限性。
但这些解释仍然无法让 Chrome 审核团队满意,于是…
- 第三、第四次拒审:快速修复过滤器
为了符合 Chrome 的要求,我们彻底移除了「快速修复过滤器」并重新提交扩展。
然而,扩展依旧被拒。我们随后联系了支持团队,并提交了一个完全禁用快速修复过滤器代码和元数据下载的版本。这个版本最终通过了审核,但…
- 第五次拒审:脚本模块(Scriptlets)和参数
Chrome 认为脚本 —— 也就是扩展内置的 JavaScript 函数 —— 由于可以使用参数执行,因此仍然违反远程执行政策。
我们的应对方案:
我们将所有脚本模块直接硬编码到扩展程序内。扩展引擎现在会验证规则是否匹配内置过滤类别(如广告拦截或安全规则)。如果匹配,则应用规则,否则直接丢弃。
同时,我们尝试以受限形式重新引入「快速修复过滤器」,但去除了基于 <script> 的执行方式。
尽管我们做出了这些调整,扩展仍然被拒。
更大的问题
当然,我们会找到解决方案,这正是我们一直在做的事。但问题不仅仅是 AdGuard 受影响,Chrome 的政策影响了所有广告拦截器和扩展开发者。
开发者需要 Chrome Web Store 提供更清晰的政策指导和更透明的审核流程。我们希望这个问题能引发更广泛的讨论,以找到安全性与功能性之间的平衡,让开发者和用户都能真正受益。