Skip to content

内联脚本标签过滤

fang5566 edited this page May 29, 2021 · 28 revisions

返回静态过滤规则语法页面



注意事项

受到浏览器 API 的限制,脚本标签过滤规则无法在所有浏览器都生效:

  • 不支持 Chromium 类浏览器
    • 相关的 Chromium 问题 加星或有助于促使 Chromium 开发版本早日提供支持。
    • 回退到统一屏蔽所有内联脚本标签或许有用。[1]
  • 不支持 Firefox WebExtensions 版本 uBO 的场景包括:
    • 使用 Firefox 56 及以下版本
    • 使用 uBO version 1.14.23b2 及以下版本

[1] 通过使用 inline-script 静态过滤规则选项 (||example.com^$inline-script),或者针对 内联脚本 使用动态过滤的 block 规则。


概述

在 uBlock Origin 中有多种方法可以阻止脚本标签的执行:

  • 屏蔽外部脚本资源:这些由网络过滤完成。
  • 一次屏蔽页面中所有嵌入的脚本标签。[1]

内联脚本标签是嵌入主页面的 JavaScript 代码块:它们不能被阻止下载,除非整个页面被屏蔽,因此这种做法用处不大。下面这个示例显示的是带有两个内联脚本标签的网页 HTML 代码:

<html>
<head>
<meta name="referrer" content="origin">
<link rel="stylesheet" href="main.css" />
<script type="text/javascript">
    function usefulCode() {
        ...
    }
    ...
</script>
<title>lorem ipsum</title>
</head>
<body>
<h1>lorem ipsum</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
<script type="text/javascript">
    function nuisanceCode() {
        ...
    }
    ...
</script>
</body>

在本例中,统一屏蔽所有内联脚本标签并非好的解决方案,因为我们在屏蔽两个脚本标签的同时也失去了所需的 usefulCode 函数。

uBlock Origin 1.15.0 引入了 HTML 过滤,用于在浏览器从服务器解析 HTML 响应 之前 移除网页中特定的内联脚本标签:

example.com##^script:has-text(...)

has-text(...) 括号中的值可以是一个普通字符串或者字面上的 JavaScript 正则表达式 (/.../)。

因此,我们可以使用脚本标签过滤精确禁用上例中的一个脚本标签(假设该页面的 URL 为 https://foo.example/bar.html):

foo.example##^script:has-text(nuisanceCode)

这条规则的意思是:对任何来自 foo.example 网站的网页,禁用所有包含 nuisanceCode 字符串的内联脚本标签。

在网站与过滤工具的猫鼠游戏中,这个脚本标签过滤是受用户欢迎的新工具,它防止网站绕过过滤工具。

它的最大优点是可以 在源代码层面 对付部分网站使用的多种反屏蔽方法。

举例来说,http://focus.de/ 在检测到用户使用过滤工具时会使用可笑的广告来劣化自己的网页,即使开启 EasyList + EasyList Germany 也无济于事,因为页面获取的图片是随机命名的,目的是阻止基于模板匹配的网络规则和修饰规则生效。

统一屏蔽所有内联脚本标签能够阻止网页自我劣化,但也可能禁用页面上其他有用的功能。不过,如果一条脚本标签规则能够屏蔽携带自我劣化的 JavaScript 代码的特定脚本标签,那它就变得更有针对性了:阻止不可取的内联 JavaScript 代码执行,同时保持可取的 JavaScript 代码不变。在写这段话时,下列脚本标签过滤规则对该网站仍然有效:

www.focus.de##^script:has-text(uabInject)

关于好处的具体例子

在这个具体的例子里,rp-online.de 的首页在检测到有过滤工具在用时会劣化自己的网页:

未开启内联脚本标签过滤时:
未开启内联脚本标签过滤

有合适的内联脚本标签规则生效时:
已开启内联脚本标签过滤

自带并默认开启的 uBlock filters 列表已经包含了一些能对付此类干扰的内联脚本标签规则。

Clone this wiki locally