我的问题有两个方面。 首先,沙箱模型如何工作,如何影响用户脚本,从网页和用户脚本的 Angular 可以访问/看到的内容,以及如果使用其他沙箱模型也会影响页面,从而能够注意到您的脚本已注入(inject)到页面(或没有)。 第二个,如何将脚本注入(inject)到页面中,并且页面可以检测到它?
第一
据我所知,当您使用@grant none
时,沙箱被禁用,您将可以访问该网页及其javascript。如果您对javascript和/或DOM进行了任何更改,则该页面可能会检测到它。
我的理解是,如果您使用@grant unsafeWindow
,您的脚本将被隔离在其自己的js上下文中,您对window
所做的任何操作都不会被网页看到,但是您可以通过unsafeWindow
访问该网页和javascript。您将可以定期访问DOM,例如document
返回常规页面文档,而不需要您说unsafeWindow.document
。显然,您对DOM或页面js上下文所做的任何更改(例如unsafeWindow.foo = 'bar';
)仍然可以检测到。之所以成为unsafe
的原因不是因为是否被检测到,而是因为您有可能在此模式下向不可信页面授予特权GM_*
函数的访问权限(在常规模式下不授予该权限,这意味着任何功能的@grant GM_*
将隔离js上下文,除非您@grant unsafeWindow
,否则您将无法访问页面的js上下文。
第二
如何将脚本注入(inject)页面?网页是否可能注意到用户脚本注入(inject)(假设用户脚本修改了页面上的NOTHING)。
例如,如果脚本是使用script
标记注入(inject)的,那么我认为该页面可能会注意到脚本注入(inject),甚至可以查看其代码吗?
沙盒模型在这种情况发生过程中是否具有任何作用,并使它“更安全”而不被看到?例如,如果使用@grant unsafeWindow
隔离了js上下文,则网页上的js甚至看不到任何用户脚本加载事件,这使得@grant unsafeWindow
从根本上更加安全,除非您当然要修改DOM或unsafeWindow
。
我还假设没有泄漏特殊功能,对象,属性等(例如GM_info
到网页,这会背叛tampermonkey的存在?)。既不在@grant none
模式下也不在@grant unsafeWindow
模式下(前提是您没有向页面泄漏任何内容)
这让我感觉到,只要不进行任何修改(特别是不要将特权的unsafeWindow
函数暴露给unsafeWindow),就不会被检测到GM_*
实际上更安全(因为js上下文是隔离的)。例如,如果在@grant none
模式下使用eventListener,则可能会检测到它,但如果在@grant unsafeWindow
模式下使用它,则可能由于隔离而无法检测到它?此外,如果某个页面有可能检测到用户脚本加载(我不知道这是否可能实现),那么它将不知道js上下文是否被隔离。
简要说明一下,如果您不背叛页面,那么页面可以检测到用户脚本或tampermonkey的存在吗?
我的上述任何想法在任何领域都是不正确的吗?如果是,那么它实际上是如何工作的?
更新
一些需要澄清的信息:
用户脚本仅从页面被动地读取信息(可能使用MutationObserver)。它不会以任何方式改变任何内容,不使用任何js库(既不在用户脚本中也不从网页中使用),没有ajax调用,没有脚本节点,绝对没有单击等。该脚本可以从JS vars中读取一些信息页面(假设那些变量和函数没有被诱杀式诱骗),以及使用WebSocket(内部服务)。也使用IIFE。因此,主要的问题是,篡改猴子本身(如果运行页面脚本)本身是否可检测?
在这个答案中:https://stackoverflow.com/a/8548311
我可以排除1、4、5、6和7;也可能是2和3,但我不知道坦佩罗尼本身是否会影响其中的任何一个
最佳答案
浏览器和Greasemonkey/Tampermonkey/Violentmonkey(大部分)已改进了注入(inject),作用域和沙盒的方式。不会使用普通的<script>
标签注入(inject)用户脚本(尽管您的脚本可能需要在某些情况下创建此类标签)。
实际上,如今是there's almost no need to use an IIFE。
但是,除了previously linked question中的检测方法之外:
@grant none
模式下,如果您将自己复制到@require
范围的库进行window
,则,页面可以看到它。大多数库都不会这样做,但是这样做的是 jQuery 。 底线是“只读”用户脚本的,不是
require
模式下的@grant none
全局库,页面无法检测到。 (除非页面是greasyfork.org等,并且您的
Allow communication with cooperate pages
设置为默认值。)如果您发现某个泄漏,从而使页面可以检测到“被动”脚本,请告知我们,并且很可能将其插入。
关于javascript - 网页可以检测到篡改用户脚本吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56821042/