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 在 #跟踪
每月 319 次下载
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)/无限重定向/短链接之外,它始终应该是幂等的。
- 命令
command
和debug
功能,以及以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.com
、https://mobile.example.com
、https://abc.m.example.com
和https://abc.mobile.example.com
转换为https://example.com
和https://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.com
和 BreezeWiki 的域为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
、__s
、at_custom
和utm_
开头的任何参数,因此可以省略这些参数。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.rs
和 mappers.rs
。
此外,url_part.rs
、string_location.rs
和 string_modification.rs
对于更复杂的规则非常重要。
陷阱
在 URL 清理器中,有一些事情我认为或许多人认为很愚蠢,但由于各种原因无法/不应该“修复”。这包括但不限于
- 对于使用“后缀”语义(例如,"google.co.uk" 中的 ".co.uk" 与 "google.com" 中的 ".com" 在语义上是相同的)的
UrlPart
和Mapper
,使用了 psl 库,该库又使用了 Mozilla 的公共后缀列表。包括了一些可能被认为是普通域名的各种后缀,如 blogspot.com。如果某个域名无法按预期工作,可能就是这个问题。
为不了解 Rust 语法的人提供的参考
Option<...>
仅表示值在 JSON 中可以是null
。以下两种状态都适用于abc: Option<String>
字段:{"abc": "xyz"}
和{"abc": null}
。Box<...>
对 JSON 语法或可能值没有影响。它只是用于让 Rust 能够将类型放入自身。Vec<...>
和HashSet<...>
被写成列表形式。HashMap<..., ...>
和HeaderMap
被写成映射形式。HeaderMap
的键始终为小写。
u8
、u16
、u32
、u64
、u128
和usize
是无符号(永不为负)整数。i8
、i16
、i32
、i64
、i128
和isize
是有符号(可能为负)整数。usize
在 32 位计算机上是u32
,在 64 位计算机上是u64
。同样,isize
在相同条件下是i32
和i64
。实际上,如果一个数字适合在字段中使用,它就会适应。Duration
的写法为{"secs": u64, "nanos": 0..1000000000}
。- 如果一个字段以
r#
开头,你就不需要写r#
(例如"else"
)。r#
只是 Rust 语法中的 "这不是关键字"。 StringSource
、GlobWrapper
、RegexWrapper
、RegexParts
以及CommandWrapper
都可以用字符串和映射表示。RegexWrapper
和RegexParts
不处理类似/.../i
的语法。CommandWrapper
不进行任何参数解析。
#[serde(default)]
和#[serde(default = "...")]
允许在期望的值几乎总是相同的情况下省略字段。- 对于
Option<...>
字段,默认值是null
。 - 对于
bool
字段,默认值是false
。
- 对于
#[serde(skip_serializing_if = "...")]
允许--print-config
CLI标志省略不必要的细节(例如,当一个字段的值是其默认值时)。#[serde(from = "...")]
、#[serde(into = "...")]
、#[serde(remote = "...")]
、#[serde(serialize_with = "...")]
、#[serde(deserialize_with = "...")]
以及#[serde(with = "...")]
都是可以忽略的实现细节。#[serde(remote = "Self")]
是一种非常奇怪的方式来允许结构体从一个映射或字符串反序列化。详情请见serde_with#702。
此外,正则表达式支持使用regex包,该包不支持前瞻和后引用。
没有这些,某些常见的正则表达式操作可能无法表达,但在实际中这种情况几乎不会出现。
MSRV
最低支持的Rust版本是最新稳定版。URL清理工具可能在旧版本上工作或不工作,但没有任何保证。
如果这是一个问题,我会尽力降低它,但Diesel也保持相对较新的MSRV,因此您可能会丢失缓存。
不受信任的输入
尽管URL清理器有各种功能标志可以禁用,以使处理不受信任的输入更安全,但没有任何保证。特别是如果正在使用的配置文件不受信任。
尽管如此,如果您发现任何使用但实际不需要HTTP请求或其他数据泄露特性的规则,请告知我。
命令行界面
解析输出
注意: 支持JSON输出。
除非使用Mapper::(e|)Print(ln|)
或Debug
变体,以下情况始终为真:
-
输入URL是一个以命令行参数提供的URL列表,然后是STDIN的每一行。
-
STDOUT的第n行对应于第n个输入URL。
-
如果STDOUT的第n行是空的,那么读取/解析/清理URL失败。
-
STDERR的第n个非空行对应于STDOUT的第n个空行。
- 目前,当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没有错误”相当,不能做出任何实际保证。
资助
依赖关系
~7–25MB
~458K SLoC