如何科学的屏蔽广告

当我们在浏览网页、使用手机应用或社交媒体时,广告总是无处不在。 有些广告可能是有用的,但更多的广告则是烦人的、分散注意力的,甚至可能是恶意的。 幸运的是,有很多方法可以屏蔽广告,让我们重新掌控浏览体验。本文将介绍一些最有效的屏蔽广告方法,并讨论它们的优缺点。

本文无意探讨广告合理性,也不针对任何特定的广告商,仅技术性的讨论如何屏蔽广告。

广告如何加载

在计科相关行业,有一道很经典的面试题:

在浏览器输入 URL 回车之后发生了什么?

这个问题答案可以简化为以下三个步骤:

  1. 域名解析 ———— 寻找服务器地址
  2. 请求/响应 ———— 与服务器建立连接,请求并接收资源
  3. 渲染内容 ———— 解析资源展示在页面上

互联网广告,作为一种资源,也是通过这三个步骤被加载到页面(客户端)上的。
知道了这一点,我们就可以通过干预这三个步骤中的任意一个来屏蔽广告。


阻断广告域名解析

众所周知,域名解析基本流程是先查找 本地hosts,再向 DNS 服务器发起请求; 通过修改 hosts 或者 指定 DNS 服务器的返回,我们可以将广告域名解析到一个不存在的地址,从而屏蔽广告。

基于 hosts 的策略

hosts 文件是一个没有扩展名的文本文件,它可以用于映射 IP 地址和主机名,它存在于几乎所有支持 TCP/IP 的操作系统中:

  • Windows:C:\Windows\System32\drivers\etc\hosts
  • Linux:/etc/hosts
  • Mac/IOS:/etc/hosts
  • Android:/system/etc/hosts

hosts文件的配置规则如下:

1
2
3
4
5
6
格式:
ip 域名

示例:
127.0.0.1  www.test.com
# 当访问www.test.com时,其实访问的是本机的127.0.0.1:80

一些常用的 hosts 列表:

基于 DNS 的策略

hosts 策略相当简单且通用,然而维护困难。与之相比,DNS 策略更加灵活,它几乎不受客户端平台限制。

我们可以简单的把 DNS 理解为一个大的 hosts 系统,只不过它不是基于文件,而是基于网络的, 我们需要在请求特定的域名时,识别其是否为广告,如果是,则返回一个不存在的地址,否则返回真实的地址。
为此,自建一个 DNS 服务器是必不可少的。

这并不是一件复杂的事情,有相当多的开源软件可以使用如 AdGuardHome SmartDNS 等。 它们可以运行于设备本地,也可以运行于局域网网关、路由器或者云服务器上。除此之外,适当的配置还可以实现 抗污染、保护隐私等功能。

关于加密 DNS 相关已经讲过两回,这里就不展开聊了:


在请求/响应中过滤

在通过域名解析获得服务器地址后,便来到了请求/响应阶段。
在网络通信过程中,涉及相当多的中间环节,为了防止被篡改,内容通常是加密的,想要修改它并不容易。

基于代理的策略

为了扒出藏在响应中的广告内容,我们需要在客户端和服务器之间加入一个中间人 也就是客户端和服务器不再直接交流,而是通过中间人 ———— 代理服务器来进行通信,这样我们自然就可以行偷梁换柱之事了。

知名广告拦截器 AdGuard(客户端) 便是基于此原理运行,它不仅可以拦截应用和网页广告, 甚至可以向网页中注入javascript代码,实现更多的功能。


在客户端进行修改

通过阻断域名解析和过滤请求/响应,我们似乎已经可以很好的屏蔽广告了 然而,为了让你能看到广告,有人是花了钱的,你看不到,钱就收不到,这不是内容提供商们所愿意看到的。

一种更常用的手段是,将广告内容和正常内容混合在一起,它们来自同一个API,当屏蔽该请求时,正常内容也会被屏蔽。
虽然在 基于代理的策略 中已可以修改 API 返回内容,但分析原始响应从中找出广告并非易事,而且某些软件会引入更复杂的加密方式, 这些使得修改响应内容变得困难。

这种情况下,只能通过修改客户端来解决

浏览器

浏览器是一个特殊的客户端,或许也是最常用的客户端。
基于 Web 的特性,通过 JavaScript 我们可以很轻易的修改页面内容,以一种眼不见为静的形式屏蔽广告

这或许是最广为使用的广告屏蔽方法,不论是 AdBlock、uBlock Origin 或是 Tampermonkey 中的用户脚本, 前者一般通过特殊的规则格式,在页面加载前屏蔽对应元素;后者则更为自由,直接将 JavaScript 代码注入到页面,除了去广告还可以实现更多操作。

桌面应用

桌面应用的修改就不似浏览器上那般轻松了,需要具备相当的专业知识,有时候需要进行反编译、逆向才可能的到源代码,进行修改, 并且这些修改可能是违法行为。

虽然如此,但互联网上还是存在很多修改版的桌面应用,去广告往往只是它们的附加特性,虽然使用可能并不违法,但还是需要注意安全

移动应用

在形式上,移动端和桌面应用可能区别并不大,修改同样需要进行逆向。 不过在 Android 平台上,去广告还有另一个不需要修改的捷径 ———— IFW

IFW 是什么 1

IFW 的全称为 Intent Firewall ,非官方中文名为 意图防火墙, 它于 Android 4.4.2 被引入到系统中, Google 没有提供官方 API 和文档来描述此功能,所以目前 IFW 是一个 Undocumented 的功能,它可能随时被更改。

IFW 的功能

Android 软件通过 Intent (意图) 来启动新活动、新服务等,而 IFW 的功能就是通过 XML 文件的配置,过滤 Intent , 让你不想要使其生效的 Intent 无效化(注意,这个 Intent 实际上还是被发送给系统了)。
IFW 是通过读取并解析存在于 /data/system/ifw 中的 XML 规则文件来进行规则过滤的,所有的配置是即时生效的。

限制

IFW 仅能通过系统应用和 root 访问进行配置,这也是由于需要保证系统防火墙的配置安全。

简而言之,通过 IFW 禁用应用中特定的广告服务、活动 既可以达到去广告的效果;比较知名的 IFW 控制软件有 MyAndroidToolsBlocker


结语

本文浅尝辄止的介绍了一下目前存在的各种广告屏蔽方式,一来水平有限,对很多内容也并不熟悉, 二来这里面可以说浓缩着各种互联网技术知识,寥寥数百字也不可能讲明白。

如文中所言,为了让你能看到广告,有人是花了钱的。
这从来就是一场攻防战,没有一劳永逸的100%屏蔽广告的方法,哪怕是加钱成为VIP 👻
有没有广告其实不重要,能专注投入在一件事里的充实和快乐才更重要。