使用正则表达式将不推荐使用的@include 转换为用户脚本中的@match
Convert deprecated @include with regular expression to @match in userscript
Tampermonkey 在我的用户脚本的 @include
语句中有弃用警告:
// @include /https\:\/\/([a-z\.]*\.)?(((stackexchange|askubuntu|superuser|serverfault|Whosebug|stackapps)\.com)|(mathoverflow\.net))\/.*/
// @exclude /^https://(chat|api|data)\./
// @exclude https://stackexchange.com/*
eslint: userscripts/better-use-match - Using @include is potentially unsafe and may be obsolete in Manifest v3 in early 2023. Please switch to @match.
More or less equal to the @include tag. You can get more information here.
Note: the <all_urls>
statement is not yet supported and the scheme part also accepts http*://
.
Multiple tag instances are allowed.
然而,尽管这些文档的帮助不大,但它们根本不等同。这不起作用:
// @match /https\:\/\/([a-z\.]*\.)?(((stackexchange|askubuntu|superuser|serverfault|Whosebug|stackapps)\.com)|(mathoverflow\.net))\/.*/
here link 根本没有提到正则表达式!如何将此正则表达式转换为在 @match
中工作?
@match
根本不支持正则表达式,它只支持 globbing。您需要将正则表达式转换为多个 glob。
@match
的处理方式是将指令分成三部分,并分别针对 URL 的各个部分进行匹配:
// @match PROTOCOL://HOSTNAME/PATH
这与 include 不同,include 指令与整个 URL 相匹配。看:
// @include https://*.example.com/*
有一个潜在的安全漏洞,因为攻击者可以制作一个 URL 像 https://attacker.example/?.example.com
这样允许您的用户脚本在攻击者的域上 运行。根据您的用户脚本的作用,它可能允许攻击者恶意使用您的脚本来窃取您的用户的数据、攻击您的用户或将他们用作 DDOS 的一部分。
如果您的正则表达式在几个不同的域之间进行选择,您将需要将 @include
正则表达式分解为许多 @match
带有 glob 的指令。请注意,在匹配主机名时,*.whosebug.com
也 匹配没有子域的 whosebug.com
。
// @match https://*.stackexchange.com/*
// @match https://*.whosebug.com/*
// @match https://*.askubuntu.com/*
// @match https://*.superuser.com/*
// @match https://*.serverfault.com/*
// @match https://*.mathoverflow.net/*
// @match https://*.stackapps.com/*
// @exclude /^https://(chat|api|data)\./
// @exclude https://stackexchange.com/*
因为 glob 的表达能力不如正则表达式,一些 @include
指令将 无法表达为 @match
。如果您使用正则表达式来匹配站点上非常具体的 URL 路径,您可能必须将用于确定您的用户脚本是否应该 运行 在特定路径上的逻辑移动到 @exclude
规则或您的脚本本身。
对主机名的 globbing 也有新的限制。通配符 必须 位于开头,并且 必须 后跟 .
。因此匹配所有 TLD 与 example.*
是不可能的,匹配部分域名如 *example.com
也是不可能的。有关详细信息,请参阅 Google's documentation for match patterns。
注意: 如果您之前使用的是 @exclude
指令,则无需对它们进行任何更改。 @exclude
指令没有被弃用。因为它 排除 域,而不是 包含 它们,所以 @exclude
引入安全漏洞的可能性要小得多。
Tampermonkey 在我的用户脚本的 @include
语句中有弃用警告:
// @include /https\:\/\/([a-z\.]*\.)?(((stackexchange|askubuntu|superuser|serverfault|Whosebug|stackapps)\.com)|(mathoverflow\.net))\/.*/
// @exclude /^https://(chat|api|data)\./
// @exclude https://stackexchange.com/*
eslint: userscripts/better-use-match - Using @include is potentially unsafe and may be obsolete in Manifest v3 in early 2023. Please switch to @match.
More or less equal to the @include tag. You can get more information here. Note: the
<all_urls>
statement is not yet supported and the scheme part also acceptshttp*://
.Multiple tag instances are allowed.
然而,尽管这些文档的帮助不大,但它们根本不等同。这不起作用:
// @match /https\:\/\/([a-z\.]*\.)?(((stackexchange|askubuntu|superuser|serverfault|Whosebug|stackapps)\.com)|(mathoverflow\.net))\/.*/
here link 根本没有提到正则表达式!如何将此正则表达式转换为在 @match
中工作?
@match
根本不支持正则表达式,它只支持 globbing。您需要将正则表达式转换为多个 glob。
@match
的处理方式是将指令分成三部分,并分别针对 URL 的各个部分进行匹配:
// @match PROTOCOL://HOSTNAME/PATH
这与 include 不同,include 指令与整个 URL 相匹配。看:
// @include https://*.example.com/*
有一个潜在的安全漏洞,因为攻击者可以制作一个 URL 像 https://attacker.example/?.example.com
这样允许您的用户脚本在攻击者的域上 运行。根据您的用户脚本的作用,它可能允许攻击者恶意使用您的脚本来窃取您的用户的数据、攻击您的用户或将他们用作 DDOS 的一部分。
如果您的正则表达式在几个不同的域之间进行选择,您将需要将 @include
正则表达式分解为许多 @match
带有 glob 的指令。请注意,在匹配主机名时,*.whosebug.com
也 匹配没有子域的 whosebug.com
。
// @match https://*.stackexchange.com/*
// @match https://*.whosebug.com/*
// @match https://*.askubuntu.com/*
// @match https://*.superuser.com/*
// @match https://*.serverfault.com/*
// @match https://*.mathoverflow.net/*
// @match https://*.stackapps.com/*
// @exclude /^https://(chat|api|data)\./
// @exclude https://stackexchange.com/*
因为 glob 的表达能力不如正则表达式,一些 @include
指令将 无法表达为 @match
。如果您使用正则表达式来匹配站点上非常具体的 URL 路径,您可能必须将用于确定您的用户脚本是否应该 运行 在特定路径上的逻辑移动到 @exclude
规则或您的脚本本身。
对主机名的 globbing 也有新的限制。通配符 必须 位于开头,并且 必须 后跟 .
。因此匹配所有 TLD 与 example.*
是不可能的,匹配部分域名如 *example.com
也是不可能的。有关详细信息,请参阅 Google's documentation for match patterns。
注意: 如果您之前使用的是 @exclude
指令,则无需对它们进行任何更改。 @exclude
指令没有被弃用。因为它 排除 域,而不是 包含 它们,所以 @exclude
引入安全漏洞的可能性要小得多。