news 2026/9/5 15:47:10

读 uBlock Origin 的 CHANGELOG:从 1.54 到 1.73 的过滤引擎演进路线图

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
读 uBlock Origin 的 CHANGELOG:从 1.54 到 1.73 的过滤引擎演进路线图

读 uBlock Origin 的 CHANGELOG:从 1.54 到 1.73 的过滤引擎演进路线图

【免费下载链接】uBlockuBlock Origin - An efficient blocker for Chromium and Firefox. Fast and lean.项目地址: https://gitcode.com/GitHub_Trending/ub/uBlock

CHANGELOG.md 是 uBlock Origin 仓库中一份按版本倒序组织的变更日志,覆盖 1.54.0 至 1.73.0 的全部发布,外加文件顶部尚未归入版本号的开发中条目。读完本文,你能掌握三件事:uBlock Origin 静态网络过滤引擎在近两年新增的每个关键过滤选项(urlskip=ipaddress=requestheadertop=message=等)及其在源码中的落地位置;scriptlet(脚本注入)框架中trusted-前缀机制的演进脉络;以及"差分更新(differential update)"这一影响所有用户带宽成本的功能是如何引入并逐步完善的。

一、CHANGELOG 的体例与阅读方式

当前仓库中的 CHANGELOG.md 遵循固定的书写约定:

  • 按语义化版本倒序排列:每个版本以# x.y.z作为 H1 标题,新版本在上、旧版本在下;
  • 版本之间以----------分隔线隔开,形成清晰的版本边界;
  • 每个版本下列出若干条目,条目为提交摘要 + 提交链接(链接指向上游提交历史,本文为自包含,不再复述外链);
  • 1.63.0 及之后的版本普遍带有## Fixes / changes二级小节,1.54.0–1.59.0 则按功能性质分为## New## Fixes / changes
  • 社区贡献者署名:非维护者的提交以(by @xxx)标注,例如env_brave预处理令牌、set-cookiechecked/unchecked取值均由@ryanbr贡献;
  • 文件顶部的无版本条目:1.73.0 之上还有一段未归入版本号的条目(如修复非受信来源脚本注入、从 AdGuard shims 导入google-ima-dai、用 filterslists-KO 替换 List-KR、移除cap_user_stylesheet支持等),代表正在开发中的下一个版本的候选变更。

这种体例的价值在于:它把"引擎能力"的每一次增量(新过滤选项、新 scriptlet、新预处理令牌、新 shim)都压缩为一行可检索的记录,是追踪 uBlock Origin 语法能力演进的权威索引。

二、版本时间线总览(1.54.0 → 1.73.0)

下表从 CHANGELOG 各版本条目中提炼主线,可作为快速定位能力引入时点的索引:

版本代表性变更(摘自 CHANGELOG)
1.54.0过滤列表差分更新落地;replace=响应体替换选项(Firefox);urltransform语法对齐replace=
1.55.0urltransform更名为uritransform;差分更新扩展到导入列表;DOM 检查器隔离
1.56.0uritransform可处理 URL 的 hash 段;修复csp=/permissions=的浏览历史泄露风险
1.57.0缓存存储重新设计;"My filters" 复选框;badfilter移除受信来源要求
1.58.0日志器新增 console 面板;selfie 加载 trie 缓冲区时的校验和验证
1.59.0:matches-prop()伪 CSS 算子;set-cookie新增essential/nonessential取值
1.60.0新增ipaddress=urlskip=两个静态网络过滤选项dnsResolveEnabled高级设置;noop 重定向资源
1.61.0urlskip=持续增强:-blocked-uricomponent、base64 解码、参数名查询、正则提取步骤;AdGuard$domain=/.../语法支持
1.62.0urlskip=新增-safebase64指令;EasyList{ remove: true }美化过滤语法;scriptlet 拆分到独立文件
1.63.0URL 缓冲区从 2048 提升到 8192;按祖先上下文来源注入 scriptlet;Firefox 最低版本相关兼容调整
1.64.0jsonl/json-edit系列 scriptlet;trusted-prevent-fetch;扩展过滤目标新增 path
1.65.0message网络过滤选项(strict-block 消息);header=语法与 DNR 规则兼容
1.66.0ipaddress=支持 strict-block;uritransform兼容 DNR 语法;csp=/permissions=可用于 object 类型
1.67.0JSONPath 正则测试;removeparam多同名参数修复
1.68.0–1.69.0prevent-dialogadthriveshim;Firefox 最低版本提升至 115
1.70.0–1.71.0top=requestheader过滤选项freeze-element-propertyprevent-navigationscriptlet
1.72.0JSONPath 引入v2:前缀(RFC9535)、正则选择器;edit-this-object/edit-element-object系列 scriptlet;ISO-8859-2 别名
1.73.0日志器保留空白字符;prevent-clipboard-write;JSONPath RFC9535 合规度提升

每个版本内部都是"若干 Fix + 若干 Feature + 大量 scriptlet Improve"的混合,其中Improve 某 scriptlet类条目占据了相当大比例——这本身就说明 scriptlet 是 uBlock Origin 迭代频率最高的子系统(下文第三节详解)。

三、过滤引擎语法演进:从 CHANGELOG 条目到源码证据

3.1 新增的静态网络过滤选项

CHANGELOG 中最值得逐条展开的是网络过滤语法的扩展。这些条目在源码中都能找到对应实现,可以交叉验证:

  • urlskip=(1.60.0 引入,1.61.0–1.62.0 快速完善):允许把"本应重定向到本地 noop 资源"的请求改写成跳过特定组件后的真实 URL。CHANGELOG 记录了它的完整成长史:1.60.0 "New static network filter optionurlskip=",1.61.0 依次加入-blocked指令、-uricomponent转换、base64 解码、正则提取步骤、查询参数名查询,且明确"重定向只允许到https:";1.62.0 又加入-safebase64指令。源码层面,选项名在 src/js/static-filtering-parser.js 中注册(第 286 行[ 'urlskip', NODE_TYPE_NET_OPTION_NAME_URLSKIP ],且第 3213 行声明为mustAssign),转换逻辑集中在独立的 src/js/urlskip.js 中,1.69.0 的 "Improveurlskipimplementation" 条目正对应该文件的重构。
  • ipaddress=(1.60.0 引入):CHANGELOG 记录了 1.60.0 先新增选项、随后加入lan/loopback取值,1.66.0 又支持作为 strict-block 的触发来源。源码中该选项在 src/js/static-filtering-parser.js 第 257 行注册、第 3184 行声明mustAssign,匹配实现在 src/js/static-net-filtering.js 中(FilterIPAddress.fid与选项值的绑定处)。
  • requestheader(1.71.0):新增按请求头过滤的选项,在 src/js/static-filtering-parser.js 第 278 行可见注册项,第 3205 行声明mustAssign: true
  • top=(1.71.0):用于限定顶层文档场景的匹配选项,CHANGELOG 原文为 "Add support for network filter optiontop="。
  • replace=(1.54.0 引入,Firefox 专属起步):响应体替换选项。CHANGELOG 1.54.0 条目明确注明 "Firefox only becausefilterResponseData"(即依赖 Firefox 专有的webRequest.filterResponseDataAPI);随后 1.55.0 扩展application/x-javascript、1.60.0 扩展application/dash+xml、1.66.4 允许replace=使用通用例外规则($~genericblock语义)。1.65.0 的 "Add support for network filter optionmessage" 则让被 strict-block 的页面能显示自定义消息,配套的 "Complete support for reporting strict-block messages" 使 strict-block 页面完整呈现message=reason信息(1.66.0 进一步改进)。
  • uritransform(1.54.0 引入为urltransform,1.55.0 更名):URL 变换选项。演进链清晰:1.54.0 "Implement network filter optionreplace=" 同期让urltransform=复用replace=语法 → 1.55.0 更名为uritransform→ 1.56.0 允许处理 URL 的 hash 段、修复多重uritransform作用于同一请求的问题 → 1.66.0 "Improve compatibility ofuritransform=with DNR syntax",向 Declarative Net Request 语法靠拢。

3.2 JSONPath 子系统的 RFC 化(1.66.0–1.73.0)

CHANGELOG 显示 JSONPath 从实验特性走向标准合规的完整路径:1.66.0 加入"选择根节点做增改"与"字符串值内模式替换";1.67.0 "Add ability to test against regex in JSONPath expressions";1.68.0 修复正则匹配 bug;1.72.0 是关键节点——引入v2:前缀以启用更高的 RFC9535 合规度,同时加入正则选择器、双引号名称支持与量词属性存在性测试;1.73.0 继续 "Increase RFC9535 compliance" 并明确 "dot notation before bracket notation is not valid" 的解析约束。当前仓库中该子系统的实现位于 src/js/jsonpath.js,解析器测试在 tools/jsonpath-tests.js 与 tools/jsonpath-tests.html,可直接运行验证v2:前缀行为。

3.3 预处理与列表生态调整

CHANGELOG 还记录了列表生态的多次调整,帮助读者理解"过滤列表来源"变化背后的决策:

  • 1.66.0 移除 "CERT.PL's Warning List",1.67.0 又 "Add back a uBO-specific version",同时 1.66.0 移除 "AdGuard Tracking Protection" 并加入实验过滤列表;
  • 1.58.0 用 AdGuard Dutch 替换 EasyDutch;
  • 顶部开发中条目用 filterslists-KO 替换 List-KR(韩语列表来源调整);
  • 1.69.0 由@ryanbr加入 Anti-AI Suggestions 列表;
  • 1.61.0 "Add ability to parse Adguard's[$domain=/.../]regex-based modifier"——即对 AdGuard 正则域名修饰符的语法兼容,这是列表作者跨工具复用的关键。

四、scriptlet 框架的演进:trusted-前缀与安全边界

CHANGELOG 中最高频的条目模式是 "Improvexxxscriptlet" 与 "Addtrusted-xxxscriptlet",两者共同勾勒出 uBlock Origin 的 JS 注入子系统:

1.trusted-前缀的引入与收紧trusted-scriptlet 只有来自受信来源(uBlock 官方列表)的过滤规则才能使用,这是隔离第三方列表作者风险的核心机制。CHANGELOG 记录了该机制的建立过程:1.57.0 "Remove obsolete trusted directives"、1.59.0 加入trusted-suppress-native-method、1.61.0 加入trusted-override-element-method/trusted-prevent-dom-bypass/trusted-prevent-xhr、1.61.0 "Addtrusted-set-attrscriptlet",以及最重要的安全修正——1.68.0 "Fix custom prefixes unduly assigning trust to external lists"(自定义前缀曾错误地给外部列表赋予信任)。顶部的开发中条目 "Fix possible injection of scriptlets requiring trust from non-trusted sources" 说明该边界至今仍在被加固。当前仓库中 scriptlet 的实现按功能拆分为多个文件,位于 src/js/resources/ 目录,例如 prevent-fetch.js、replace-argument.js、cookie.js(set-cookie/trusted-set-cookie的实现)、scriptlets.js(注册与分发核心)——这正对应 1.62.0 "Keep moving related scriptlets into separate files" 的重构条目。

2. 响应体改造类 scriptlet 的代际演进。CHANGELOG 可以串出一条清晰的"响应改写"能力链:1.59.0 改进json-prune相关 scriptlet → 1.64.0 引入json-edit套件与jsonl-prune-xhr-response/jsonl-prune-fetch-response→ 1.65.0 加入[trusted-]edit-inbound-object→ 1.72.0 引入edit-this-object/trusted-edit-this-objectedit-element-objectedit-object-on-[getter|setter]→ 1.73.0 改进json-edit。这些名称在 src/js/resources/json-edit.js 与 src/js/resources/json-prune.js 中均可找到对应实现。

3. 防绕过类 scriptlet 的积累prevent-家族是另一条主线:prevent-fetch(从 1.54.0 起被反复改进至少 6 次,CHANGELOG 中有大量 "Improveprevent-fetchscriptlet" 条目)、prevent-xhr/trusted-prevent-xhr(1.61.0)、prevent-dialog(1.69.0)、prevent-navigation(1.71.0)、prevent-clipboard-write(1.73.0 新增并在开发中继续改进)、prevent-innerHTML(1.63.2)等。每个条目背后都是对"页面如何绕过被禁用的原生 API"这一攻防面的封堵。

4. 注入时机的精细控制。1.63.0 "Add ability to inject scriptlets according to origin of ancestor contexts" 允许按祖先帧的来源决定是否注入,实现位于 src/js/resources/run-at.js 等运行时基础设施中;1.64.0 "Mind potential race condition when dynamically registering scriptlets" 则修复了动态注册的竞态。

五、差分更新:一项影响所有用户的带宽优化

CHANGELOG 1.54.0 是唯一带有## New独立小节并配长文说明的版本,主题是过滤列表的差分更新(differential update)。其原文要点值得完整继承:

  • 动机:uBlock Origin 不希望按带宽占用挤进"最热门项目"榜单(原文引用了 jsDelivr 公开统计作为背景);
  • 预期收益:差分更新预计同时降低请求数与带宽用量——更新列表时只传输补丁而非全量文本;
  • 使用前提(重要限制):要享受更短的自动更新周期,必须让 uBlock 自动更新过滤列表;手动强制更新会使差分更新失效,直到下一次自动更新为止

源码层面,该功能由 src/js/diff-updater.js 实现,并在后续版本中持续完善:1.55.0 将差分更新扩展到导入列表、支持差分友好的 updater-link、支持all列表令牌,1.57.0 "Make asset updater compatible with non-persistent background page",1.58.0 加入 "Add a console pane to the logger"(便于观察更新日志),1.64.0 "Fetch diff patches from 'reliable' servers only"(补丁只从可靠服务器获取),1.69.0 "Improveurlskipimplementation" 同期的 "Fix merging of uncommitted filters" 也属于更新链路的一部分。1.63.0 还有 "Use onmessage/postMessage instead of BroadcastChannel in diff updater" 的实现细节调整,1.61.0 "Mind that BroadcastChannel constructor can throw in Firefox" 则体现了跨浏览器兼容成本。

六、安全修复条目:值得单独关注的几项

CHANGELOG 中若干条目直接关系到"第三方列表作者能否被信任",对使用自定义列表的用户尤其重要:

  • 1.56.0 两项历史泄露修复:"Fix potential exfiltration of browsing history by a rogue list author throughpermissions=" 与 "...throughcsp="(由社区用户报告)——即恶意列表作者可能借助csp=/permissions=选项间接读取浏览历史;
  • 1.68.0"Fix custom prefixes unduly assigning trust to external lists"——受信边界修复(见第四节);
  • 1.69.0"Fix regression inprevent-fetchscriptlet" 与1.62.0"Fix regression intrusted-replace-argument"——scriptlet 的回归修复;
  • 1.66.4"Fix potential infinite loop when scanning for$anchor"——解析器死循环修复;
  • 顶部开发中条目"Fix possible injection of scriptlets requiring trust from non-trusted sources"——受信 scriptlet 注入边界的再次加固。

这些条目说明 uBlock Origin 的威胁模型把"过滤列表作者"视为半可信输入,trusted-前缀、csp=/permissions=的收敛、差分补丁来源白名单都是同一模型的产物。

七、平台与工程侧变更

CHANGELOG 也记录了不可忽视的平台兼容性约束与工程重构:

  • Firefox 最低版本:1.69.0 将 Firefox 最低要求版本提升到115(原条目带[firefox]前缀,CHANGELOG 用方括号前缀标注平台特定变更,如 1.71.0 的[chromium]前缀表示 Chromium 平台的.svg资源被归类为 image 类型);
  • 序列化与缓存:1.57.0 "Redesign cache storage"(缓存存储重设计,src/js/cachestorage.js),1.57.2 即修复该设计引入的 stray lists 回归,1.58.0 "Add checksum validation when loading trie buffers in selfie",1.59.0 "Fix bad serialization of Date objects",1.61.2 "Better handle unexpected conditions when deserializing"——s14e 序列化格式(src/js/s14e-serializer.js)的健壮性是被反复打磨的;
  • UI 侧:1.58.0 日志器新增 console 面板,1.56.0 脚本参数在活跃行中视觉分离,1.57.0 "Support maximizing editor to viewport size"、"Add advanced setting to force popup panel orientation",1.73.0 "[logger] Preserve whitespace characters";
  • 高级设置项:CHANGELOG 中新增的高级设置可在 src/js/background.js 的默认值定义中验证——1.60.0 的dnsResolveEnabled(第 70 行默认true)与 1.57.0 的requestStatsDisabled(第 83 行默认false,控制 src/js/storage.js 中的请求统计持久化);
  • 构建与工具链:1.55.0 "Support non-default sticky lists"、"Refactoring: Replace DOM events with broadcast channels"(对应 src/js/broadcast.js)。

八、如何把 CHANGELOG 用作开发索引

对想深入 uBlock Origin 的开发者,这份日志的实际用法建议如下:

  1. 按语法选项反查版本:想知道某选项何时可用,直接在 CHANGELOG.md 中搜索选项名(如urlskipipaddressrequestheadertop=message),即可定位引入版本与后续修复版本;
  2. 版本 → 源码路径对照:本文第三节给出的对照关系(选项 → src/js/static-filtering-parser.js 的选项注册表)适用于所有网络过滤选项,mustAssign: true的声明(第 3205–3213 行一带)表示该选项必须带=赋值;
  3. 平台差异注意:带[chromium]/[firefox]前缀的条目是平台特定变更,例如replace=在 1.54.0 引入时仅限 Firefox(依赖filterResponseData),阅读时不可把它外推为双平台能力;
  4. 适用前提:本文所有结论以当前仓库内容为准,对应 1.54.0 至 1.73.0 及文件顶部的开发中条目;仓库内 platform/mv3/ 等目录表明当前代码同时面向 MV3 构建(tools/make-mv3.sh可构建),但 CHANGELOG 本身不标注 MV3 里程碑,涉及 MV3 的能力边界需另行查阅对应 manifest 与文档。

小结

CHANGELOG.md 表面上只是一份提交清单,实际上它是 uBlock Origin 过滤语言的能力地图:replace=uritransformurlskip=/ipaddress=勾勒出"网络层从阻断走向改写"的路线;trusted-scriptlet 家族的膨胀勾勒出"注入层信任边界"的收紧;差分更新与序列化健壮性条目则勾勒出"分发层成本优化"的持续投入。结合 src/js/static-filtering-parser.js、src/js/resources/ 与 src/js/diff-updater.js 中的源码证据,这份日志足以作为理解该项目架构演进的单一可信入口。

【免费下载链接】uBlockuBlock Origin - An efficient blocker for Chromium and Firefox. Fast and lean.项目地址: https://gitcode.com/GitHub_Trending/ub/uBlock

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/5 15:46:49

如何免费解锁Wand远程控制:Wand-Enhancer指南

如何免费解锁Wand远程控制:Wand-Enhancer指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer 键盘在书房,你在沙发&#xf…

作者头像 李华
网站建设 2026/9/5 15:46:09

MAA 自动公招怎么配置?4 个参数就能接管你的公开招募

MAA 自动公招怎么配置?4 个参数就能接管你的公开招募 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https://gitc…

作者头像 李华
网站建设 2026/9/5 15:45:25

Arduino下SG90 360度连续旋转舵机实测:PWM控制与开环控制详解

刚入手 SG90 舵机时,我想做一个小型摇头云台,按网上的教程写 servo.write(90) 确实能转,但换成另一颗“SG90”后,角度却对不上,甚至出现“明明让舵机转 180,结果它自己转了一圈又一圈”的现象。后来才发现…

作者头像 李华
网站建设 2026/9/5 15:43:53

MoE 负载均衡深度解析:专家累死、摸鱼与负载崩塌

简介 MoE(混合专家模型)最致命的原生缺陷:路由器马太正反馈引发负载崩塌。训练过程中路由器会持续把 Token 路由到少数表现更好的专家,其余专家长期接收样本不足陷入休眠;显存、参数资源大量浪费,MoE 稀疏加速增益直接消失,性能甚至劣于同规模稠密大模型。 行业主流解法…

作者头像 李华
网站建设 2026/9/5 15:42:41

基于STM32与PAJ7620的手势识别系统:从硬件搭建到软件抗干扰实战

简介:本资源是一套基于STM32F10x系列微控制器与PAJ7620红外手势识别传感器的完整嵌入式开发实践方案,面向嵌入式初学者、课程设计学生及智能交互硬件开发者,解决非接触式人机交互系统从驱动适配到手势响应的全流程实现问题。压缩包共98个文件…

作者头像 李华
网站建设 2026/9/5 15:39:36

PMSM无感FOC转子初始位置辨识:脉冲注入法原理与工程实践

PMSM 无感 FOC 控制中,电机启动前的转子初始位置辨识是一个绕不开的环节。很多人第一次接触“脉冲注入法”时,会以为它和传统的高频方波注入类似,只要向 d 轴注入电压脉冲就能收敛到磁极方向。实际做实机测试后才会发现,IPM 电机的…

作者头像 李华