#url #参数 #跟踪 #隐私 #查询参数 #命令行工具 #环境变量

程序+库 url-cleaner

一个专注于去除跟踪垃圾的 URL 操作命令行工具和库

5 个版本 (3 个重大更新)

新版本 0.4.0 2024 年 8 月 9 日
0.3.2 2024 年 7 月 25 日
0.3.0 2024 年 7 月 25 日
0.2.0 2024 年 6 月 29 日
0.1.0 2024 年 4 月 24 日

#6#跟踪

Download history 85/week @ 2024-04-22 134/week @ 2024-06-24 21/week @ 2024-07-01 207/week @ 2024-07-22 25/week @ 2024-07-29 87/week @ 2024-08-05

每月 319 次下载

AGPL-3.0 或更高版本

475KB
4.5K SLoC

URL 清理器

网站通常会将唯一的标识符放入 URL 中,这样,当您向朋友发送链接并让他们打开时,网站就知道是您发送的。
由于大多数人不懂,因此无法同意这一点,所以在发送 URL 之前删除间谍软件查询参数是一种礼貌的行为。
URL 清理器是一款极为通用的工具,旨在使此过程尽可能全面、快速和简单。

C 依赖项

以下包在 Kubuntu 2024.04(以及可能的所有基于 Debian 的发行版)上需要安装。

  • libssl-dev
  • libsqlite3-dev

可能还有更多依赖项需要安装,不同的 Linux 发行版可能预装了这些依赖项,也可能没有。

如果您无法编译它,我会尽力帮助您。如果您能自己让它工作,请告诉我,我可以将此列表补充完整。

匿名性

理论上,如果您是唯一一个在网站上分享不包含 URL 跟踪器的帖子的用户,网站可能会意识到这一点,并以相同的方式跟踪您(“如果没有跟踪器,则假定发件人是 Jared”。)。
实际上,您不太可能是唯一一个分享干净 URL 的用户。搜索引擎通常提供不带跟踪器的 URL[待引用],有些人会手动删除跟踪器,有些网站(如 vxtwitter.com)会自动去除 URL 跟踪器。

然而,对于某些网站,默认配置可能会去除比搜索引擎更多的内容。在这种情况下,匿名性就会依赖于许多人使用 URL 清理器并为彼此提供掩护。

与 Tor、抗议活动和任何涉及隐私的事情一样,安全来自于人数众多。

规范化和统一化

存在一个关于“规范”URL 的模糊概念。一个可以将其语义转换为不带外部细节的规范形式的 URL。

例如,https://amazon.com/product-name-here/dp/PRODUCTID 可以“规范化为”https://amazon.com/dp/PRODUCTID

我还没有决定是否要移除 minimize 标志,或者只是将其设为默认行为。

欢迎对此提出意见。

基本用法

默认情况下,编译URL清理工具时会包含二进制文件中的 default-config.json 文件。因此,URL清理工具可以简单地使用 url-cleaner "https://example.com/of?a=dirty#url" 进行操作。

默认配置

默认配置旨在始终遵循以下规则

  • “有意义的语义变化”[定义?]仅应作为启用标志的结果发生。
    • 如之前所述,像导航栏中亚马逊商品列表链接这样的不显著细节,其略有不同是微不足道的。
  • “语义有效”[定义?]的URL不应引发错误。
    • 非语义有效的URL也不应引发错误,但这通常不太重要。
    • 语义有效的URL永远不应更改语义或变为语义无效。
      • 如果存在明显的方法(例如:unmangle标志),语义无效的URL可能变为语义有效。
  • 除了长(>10)/无限重定向/短链接之外,它始终应该是幂等的。
  • 命令commanddebug功能,以及以experiment-/experimental-开头的任何功能都不应启用。为了方便起见,默认启用了命令功能,但在可能运行不受信任/用户提供的配置的情况下,应禁用。
  • 所有缓存都应具有确定性。
    • 此外,预期默认配置的其他部分也应该是确定的,但在没有缓存的情况下,修正不会引起问题。
    • 通常重定向链接不会随机更改(比如 goo.gl)。
    • onion-location标志会稍微打乱这一点,但无论如何。

目前没有做出任何保证,尽管当上述规则被违反时,它被认为是错误,并且我很乐意知道。

此外,这些规则可能随时出于任何原因而更改。通常只是为了澄清。

标志

标志允许您使用--flag name --flag name2命令行语法指定行为。

默认配置中包含各种标志,用于执行我经常想要执行的操作。

  • no-https-upgrade:禁用将http://替换为https://
  • no-http:不要发出任何HTTP请求。
  • assume-1-dot-2-is-shortlink:将所有匹配正则表达式^.\...$的URL视为短链接。实事求是地说,它们都是。
  • no-unmangle:禁用所有解纠缠。
  • no-unmangle-host-is-http-or-https:不要将https://https//example.com/abc转换为https://example.com/abc
  • no-unmangle-path-is-url:不要将https://example1.com/https://example2.com/user转换为https://example2.com/abc
  • no-unmangle-second-path-segment-is-url:不要将https://example1.com/profile/https://example2.com/profile/user转换为https://example2.com/profile/user
  • no-unmangle-subdomain-ends-in-not-subdomain:不要将https://profile.example.com.example.com转换为https://profile.example.com
  • no-unmangle-subdomain-starting-with-www-segment:不要将https://www.username.example.com转换为https://username.example.com
  • unmobile:将 https://m.example.comhttps://mobile.example.comhttps://abc.m.example.comhttps://abc.mobile.example.com 转换为 https://example.comhttps://abc.example.com
  • minimize:移除那些可能不与跟踪相关的非必要部分。
  • youtube-unshort:将 https://youtube.com/shorts/abc 转换为 https://youtube.com/watch?v=abc
  • discord-unexternal:将 images-ext-1.discordapp.net 替换为它们所引用的原始图片。
  • discord-compatibility:设置 twitter.com 的域为 twitter-embed-domain 变量指定的域。
  • deadname-twitter:将 x.com 更改为 twitter.com
  • breezewiki:设置 fandom.comBreezeWiki 的域为 breezewiki-domain 变量指定的域。
  • unbreezewiki:将 BreezeWiki 转换为 fandom.com
  • tor2web:将 tor2web-suffix 变量指定的后缀追加到 .onion 域名之后。
  • tor2web2tor:将 **.onion.** 域名替换为 **.onion 域名。
  • bypass.vip:使用 bypass.vip 扩展 linkvertise 链接。由于 API 停止运行,目前无法测试。

如果配置文件中的 "params" 字段中启用了标志,则可以使用 --unflag flag1 --unflag flag1 禁用该标志。

变量

变量允许您使用 --var name=value --var name2=value2 命令行语法指定行为。

默认配置中包含了许多变量,用于具有多个有用值的对象。

  • twitter-embed-domain:当指定 discord-compatibility 标志时,用于 Twitter 的域。默认为 vxtwitter.com
  • breezewiki-domain:用于将 fandom.com 和 BreezeWiki 转换为 BreezeWiki 的域。默认为 breezewiki.com
  • tor2web-suffix:如果启用了 tor2web 标志,则将后缀追加到 .onion 域名末尾。不应以 . 开头,因为这将自动添加。默认不设置。
  • bypass.vip-api-key:用于 bypass.vip 高级后端的 API 密钥。覆盖 URL_CLEANER_BYPASS.VIP_API_KEY 环境变量。

如果在配置文件的"params"字段中指定了变量,可以使用--unvar var1 --unvar var2来不指定这些变量。

环境变量

在配置中有些内容您可能不想包含,比如API密钥,而重复使用--key abc=xyz命令也很麻烦。为此,URL Cleaner会利用原生环境变量。

  • URL_CLEANER_BYPASS.VIP_API_KEY:用于的付费后端API密钥。可以使用bypass.vip-api-key变量来覆盖。

集合

集合允许您快速检查一个字符串是否是多个特定字符串之一。

默认配置中包含各种集合。

  • https-upgrade-host-blacklist:即使未启用no-https-upgrade标志,也不要从http升级到https的主机。
  • shortlink-hosts:被视为短链接的主机,它们返回HTTP 3xx状态代码。此集合中的主机(以及主机以"www."开头然后是此集合中的主机的URL)将应用ExpandShortLink映射器。
  • utps-host-whitelist:从不从其中移除通用跟踪参数的主机。
  • utps:对于不在utp-host-whitelist集合中的主机,始终移除的“通用跟踪参数”集合。请注意,默认配置中的UTP规则也会移除以cm_mmc__sat_customutm_开头的任何参数,因此可以省略这些参数。
  • unmangle-path-is-url-host-whitelist:相当于为指定主机启用的no-unmangle-path-is-url
  • unmangle-subdomain-ends-in-not-subdomain-not-subdomain-whitelist:相当于为指定非子域启用的no-unmangle-subdomain-ends-in-not-subdomain-not-subdomain-whitelist
  • breezewiki-hosts:当启用breezewiki标志时,使用breezewiki-domain变量替换的主机。始终替换fandom.com,因此它不在该集合中。
  • lmgtfy-hosts:替换为google.com的主机。

可以使用--insert-into-set name1 value1 value2 --insert-into-set name2 value3 value4将元素插入集合中。

可以使用--remove-from-set name1 value1 value2 --remove-from-set name2 value3 value4从集合中删除元素。

列表

列表允许您遍历字符串,例如检查另一个字符串是否包含其中的任何字符串。

目前默认配置中只包含一个列表。

  • utp-prefixes:如果查询参数以该列表中的任何字符串(如utm_)开头,则将其移除。

目前还没有它们的命令行语法。实际上应该有。

引用

我从默认配置中盗取了各个部分的人和项目。

基本上我就是指UTP集合。以及UTP前缀列表。

自定义规则

尽管配置架构的适当文档尚待我忙里偷闲来编写,但url_cleaner仓库本身有相当好的文档,并且各种类型(我认为)相当容易理解。
您需要查看的主要文件是 conditions.rsmappers.rs
此外,url_part.rsstring_location.rsstring_modification.rs 对于更复杂的规则非常重要。

陷阱

在 URL 清理器中,有一些事情我认为或许多人认为很愚蠢,但由于各种原因无法/不应该“修复”。这包括但不限于

  • 对于使用“后缀”语义(例如,"google.co.uk" 中的 ".co.uk" 与 "google.com" 中的 ".com" 在语义上是相同的)的 UrlPartMapper,使用了 psl 库,该库又使用了 Mozilla 的公共后缀列表。包括了一些可能被认为是普通域名的各种后缀,如 blogspot.com。如果某个域名无法按预期工作,可能就是这个问题。

为不了解 Rust 语法的人提供的参考

此外,正则表达式支持使用regex包,该包不支持前瞻和后引用。
没有这些,某些常见的正则表达式操作可能无法表达,但在实际中这种情况几乎不会出现。

MSRV

最低支持的Rust版本是最新稳定版。URL清理工具可能在旧版本上工作或不工作,但没有任何保证。

如果这是一个问题,我会尽力降低它,但Diesel也保持相对较新的MSRV,因此您可能会丢失缓存。

不受信任的输入

尽管URL清理器有各种功能标志可以禁用,以使处理不受信任的输入更安全,但没有任何保证。特别是如果正在使用的配置文件不受信任。
尽管如此,如果您发现任何使用但实际不需要HTTP请求或其他数据泄露特性的规则,请告知我。

命令行界面

解析输出

注意: 支持JSON输出

除非使用Mapper::(e|)Print(ln|)Debug变体,以下情况始终为真:

  1. 输入URL是一个以命令行参数提供的URL列表,然后是STDIN的每一行。

  2. STDOUT的第n行对应于第n个输入URL。

  3. 如果STDOUT的第n行是空的,那么读取/解析/清理URL失败。

  4. STDERR的第n个非空行对应于STDOUT的第n个空行。

    1. 目前,当URL成功时,不会打印空的STDERR行。虽然这会使解析输出更容易,但会在终端上造成视觉杂乱。虽然这很可能默认不会改变,但解析器应该确保严格遵循4,以防这作为一个选项添加。

JSON输出

可以使用--json/-j标志,使URL Cleaner输出JSON而不是行。

确切格式目前尚不稳定。

如果使用Mapper::Print(ln|),则这不一定保证是有效的JSON。

恐慌策略

URL Cleaner仅在以下情况下才会恐慌

  • 解析命令行参数失败。

  • 加载/解析配置失败。

  • 打印配置失败。(不应该可能。)

  • 测试配置失败。

  • 从STDIN/STDOUT/STDERR读取/写入时发生灾难性错误。

  • 内存不足,导致标准库函数/方法恐慌。这应该非常罕见。

  • (仅在启用debug功能时可能)控制调试打印缩进的互斥锁被毒化,并尝试获取锁。这仅在URL Cleaner作为库使用时才可能发生。

在这些情况之外,URL Cleaner永远不会恐慌。然而,由于这与“URL Cleaner没有错误”相当,不能做出任何实际保证。

资助

URL Cleaner不接受捐赠。如果您需要捐赠,请改为捐赠给Tor项目和/或互联网档案馆

依赖关系

~7–25MB
~458K SLoC