广告与追踪器,在被请求之前就已拦下
SandBlock 是一个 Firefox 扩展,在广告与追踪请求离开浏览器之前就把它们取消。什么都没下载,所以页面更轻 —— 也更安静。无账号、无遥测、不收集任何数据。
- 版本
- v1.0.0
- 系统要求
- Firefox 91+
- 收集的数据
- 0

- 156,760
- 条从公共列表编译出的过滤规则
- 0.17 ms
- 每个请求的过滤耗时
- 8
- 份参考列表,每 24 小时刷新
启动时只编译一次,耗时 573 毫秒。之后判断一个请求只需不到一毫秒的零头。
四种东西,四套机制
拦截不是一招通用。网络过滤对 YouTube 广告无能为力,而把元素藏起来并不能阻止它下载 —— 所以每一种都用真正对它有效的那套机制。
广告与追踪请求
在网络层取消,发出之前就拦下。请求从未离开浏览器:什么都没下载,对面也什么都没记录。
广告留下的空洞
被拦下的广告仍会在版面上留一个坑。样式规则把这个占位隐藏掉,让页面读起来像从来没有这个位置。
YouTube 视频广告
视频广告和视频本身走同一条管道,网络拦截无从下手。脚本片段在页面自身代码之前运行,把播放器响应里的广告元数据剔除。
链接里的追踪参数
fbclid、gclid、utm_* 以及另外约 120 个参数在请求时从 URL 里剥掉,让你点的链接不同时是一个信标。
为什么快
笨办法是拿每个请求去比对每一条规则。规则有 156,760 条,这条路走不通,所以每条过滤规则都按它最具辨识度的 token 建索引 —— 也就是模式里最罕见的那串字符。请求到达时,只访问该 URL 里真正出现的 token 对应的那几个桶,相对整份规则只是极小一撮。
围绕它的是那些让它不惹人注意的细节:模式确实需要时才编译正则,子串与锚点检查完全不用正则,比对寄存器复用而不是每个请求重新分配。在 Firefox 上实测,过滤开销为每个请求 0.17 毫秒 —— 低于一次网络往返的噪声。
以不弄坏网站为前提设计
拦截器最糟的故障是看不见的那种。作用范围过宽的样式规则会藏掉本不该碰的页面部件,而由于它以用户样式生效,页面无法把它撤销。所以每条规则在使用前都要检查:任何能够触及文档根节点、或能匹配任意元素的选择器,一律直接丢弃,而不是先用上再指望它没事。
通用规则同样是按需下发,而不是一股脑全撒。页面报告自己真正含有哪些 class 和 id,只有匹配上的选择器才注入。在一个普通页面上,注入的 CSS 因此从约 254 KB 降到 17 KB 以内 —— 这是「能感觉到的样式重算」和「感觉不到」之间的差别。
始终是最新的
八份参考列表,每 24 小时自动刷新。你可以添加自己的过滤规则和自己的信任站点,任何一份列表出问题都能关掉。
- EasyList83,735 条规则
- EasyPrivacy54,118 条规则
- uBlock filters — Ads8,902 条规则
- Peter Lowe's list3,412 条规则
- uBlock filters — Quick fixes479 条规则
- SandBlock — fixes71 条规则
过滤列表是数据,不是代码:列表里的任何一行都永远不会被执行。想关哪份、想加自己的,都在设置里。

SandBlock —— 常见问题
真的是免费的吗?
是,而且没有什么需要注册。SandBlock 没有账号、没有付费档、内部也没有别的推销。它存在,是因为我们本来就在做一个隐私扩展,而拦截器是同一件事的另一半。
为什么是 Firefox 而不是 Chrome?
因为 Firefox 仍然支持阻塞式 webRequest,让扩展能在请求发出之前把它取消。Chrome 把它换成了 declarativeNetRequest —— 一个有规则上限、无法动态判断的声明式模型,正是这个变化削减了所有拦截器在那边能做的事。做一个更弱的版本不值得。
会不会弄坏我常用的网站?
这正是引擎针对性设计要避免的故障,上面那一节讲了怎么做的。如果某个页面确实显示不对,在弹窗里一键为该站点暂停保护 —— 开关是按站点的,而且会记住。然后告诉我们是哪一页:我们去修那条规则,而不是让你将就。
会让浏览器变慢吗?
过滤开销为每个请求 0.17 毫秒,列表在启动时只编译一次,耗时 573 毫秒。实际上页面会更快而不是更慢:一次加载里真正昂贵的部分,恰恰是那些现在不再发生的请求。
它收集哪些数据?
不收集任何数据。没有账号、没有统计、没有遥测。SandBlock 唯一会发出的请求,是去官方地址取公共过滤列表,这些请求不带标识,也不含你访问过哪些页面的信息。设置和计数存在浏览器本地存储里,卸载即消失。