我的问题有两个方面。首先,沙盒模型如何工作,如何影响用户脚本,从网页和用户脚本角度可以访问/看到的内容,以及如果使用其他沙盒模型会影响页面,从而能够注意到脚本已注入到页面中(或不)。其次,如何将脚本注入到页面中,并且页面可以检测到它?
据我所知,当您使用时@grant none,沙箱已禁用,您将可以访问该网页及其javascript。如果您对javascript和/或DOM进行了任何更改,则该页面可能会检测到它。
我的理解是,如果使用的话@grant unsafeWindow,您的脚本将被隔离在自己的js上下文中,您所做的任何事情window都不会被网页看到,但是您可以通过来访问网页和javascript unsafeWindow。您将具有对DOM的常规访问权限,例如document返回常规页面文档,而无需说unsafeWindow.document。显然,您对DOM或页面js上下文所做的任何更改(例如unsafeWindow.foo = 'bar';)仍然可以检测到。其原因unsafe不是因为是否被检测到,而是因为您有可能GM_*在此模式下使不受信任的页面访问特权功能(在常规模式下不授予特权功能,这意味着@grant GM_*因为任何功能都会隔离js上下文,除非您(@grant unsafeWindow),否则您将无法访问页面的js上下文
如何将脚本注入页面?网页是否可能注意到用户脚本注入(假设用户脚本修改了页面上的NOTHING)。
例如,如果脚本是使用script标记注入的,那么我认为该页面可能会注意到脚本注入,甚至可以查看其代码吗?
沙盒模型在这种情况发生过程中是否具有任何作用,并使它“更安全”而不被看到?例如,如果您使用来隔离js上下文@grant unsafeWindow,那么网页上的js甚至可能看不到任何用户脚本加载事件,因此@grant unsafeWindow从根本上更安全,除非您去修改DOM或unsafeWindow当然。
我还假设不存在特殊功能,对象,属性等的泄漏(例如GM_info泄露到tampermonkey存在的网页上)。既不在@grant none模式@grant unsafeWindow下也不在模式下(前提是您没有向页面泄漏任何内容)
unsafeWindow只要您不修改任何内容(尤其是不要将特权GM_*函数暴露给unsafeWindow),这会让我觉得实际上在被检测到方面更安全(因为js上下文是隔离的)。例如,如果在@grant none模式下使用eventListener ,则可能会检测到它,但如果在@grant unsafeWindow模式下使用,则可能由于隔离而无法检测到它?此外,如果某个页面有可能检测到用户脚本加载(我不知道这是否可能实现),那么它将不知道js上下文是否隔离
简要总结一下,如果您不背叛页面,那么页面是否可以检测到用户脚本或tampermonkey的存在?
我的上述任何想法在任何领域都是错误的吗?如果是,那么它实际上是如何工作的?
一些需要澄清的信息:
用户脚本仅从页面被动地读取信息(可能使用MutationObserver)。它不会以任何方式改变任何内容,不使用任何js库(既不在用户脚本中也不从网页中使用),没有ajax调用,没有脚本节点,绝对没有单击等。脚本可以从JS vars中读取一些信息页面(假设那些var和函数没有被诱杀),以及使用WebSocket(内部服务)。也使用IIFE。因此,主要的问题是,篡改猴子本身 …