【发布时间】:2019-06-29 21:41:24
【问题描述】:
我的问题有两个方面。 首先,沙盒模型的工作原理,它如何影响用户脚本,从网页和用户脚本的角度可以访问/看到的内容,以及使用不同的沙盒模型是否会影响页面能够注意到您的脚本被注入页面(或不注入)。 二,脚本是如何注入页面的,页面能检测到吗?
第一
据我所知,当您使用@grant none 时,沙箱被禁用,您将可以访问该网页及其 javascript。如果您对 javascript 和/或 DOM 进行任何更改,页面可能会检测到它。
我的理解是,如果你使用@grant unsafeWindow,你的脚本将被隔离在它自己的js上下文中,你对window所做的任何事情都不会被网页看到,但是你可以通过@访问网页和javascript 987654325@。您将可以定期访问 DOM,例如document 返回常规页面文档,而不是您需要说 unsafeWindow.document。显然,您对 DOM 或页面 js 上下文(例如unsafeWindow.foo = 'bar';)所做的任何更改仍然可以检测到。它是unsafe 的原因不是因为是否被检测到,而是因为您可以在此模式下潜在地授予不受信任的页面访问特权GM_* 功能(在常规模式下不授予这些功能,这意味着@grant GM_* 任何函数都会隔离 js 上下文,除非你 @grant unsafeWindow)
第二
脚本是如何注入页面的?网页是否有可能注意到用户脚本注入(假设用户脚本在页面上没有修改任何内容)。
例如,如果一个脚本是使用script标签注入的,我认为页面可能会注意到脚本注入,甚至看看它的代码?
沙盒模型在这种情况下是否起任何作用,并使其“更安全”不被看到?例如,如果使用@grant unsafeWindow,js上下文是隔离的,那么网页上的js可能甚至看不到任何用户脚本加载事件,使@grant unsafeWindow从根本上更安全,除非你去修改DOM或unsafeWindow当然。
我还假设没有泄漏特殊功能、对象、属性等(例如 GM_info 到网页,这会暴露 Tampermonkey 的存在?)。在@grant none 模式或@grant unsafeWindow 模式下都不行(前提是您没有向页面泄露任何内容)
这让我觉得unsafeWindow 在不被发现方面实际上更安全(因为 js 上下文是隔离的),只要你不去修改任何东西(特别是不要暴露特权 GM_* unsafeWindow 的功能)。 例如,如果你在@grant none模式下使用了一个eventListener,它可能会被检测到,但是如果你在@grant unsafeWindow模式下使用它,它可能因为隔离而无法被检测到?此外,如果页面可以检测到用户脚本加载(我不知道这是否真的可能),它不会知道 js 上下文是否被隔离
简而言之,如果您不背叛,页面能否检测到您的用户脚本或篡改猴子的存在?
我上面的任何想法在任何领域都不正确,如果是,它实际上是如何工作的?
更新
需要澄清的一点信息:
用户脚本只能被动地从页面读取信息(可能使用 MutationObserver)。它不会以任何方式改变任何东西,不使用任何 js 库(既来自用户脚本也来自网页)没有 ajax 调用,没有脚本节点,绝对没有点击等。脚本可以从 JS vars 读取一些信息页面(让我们假设这些变量和函数没有被诱杀),以及使用 WebSocket(内部服务)。也使用 IIFE。所以问题主要是,tampermonkey 本身(如果它运行页面脚本)是否可以检测到?
在这个答案中:https://stackoverflow.com/a/8548311 我可以排除1、4、5、6和7;可能还有 2 和 3,但我不知道 Tampermonkey 本身是否会影响其中任何一个
【问题讨论】:
标签: javascript google-chrome sandbox tampermonkey userscripts