在javascript中,你想什么时候使用它:
(function(){
//Bunch of code...
})();
Run Code Online (Sandbox Code Playgroud)
对此:
//Bunch of code...
Run Code Online (Sandbox Code Playgroud) 自从几天前发布了新的Greasemonkey 1.0以来,每个拥有jQuery的站点以及我在Greasemonkey脚本中使用jQuery的站点都没有正确运行我的脚本.我在我的GS脚本中使用@require的jQuery (使用元数据)与页面的jQuery冲突.这是由于新@grant代码.
我已经阅读了文档,但仍然不知道如何再次在沙箱中运行GS脚本; 唯一的选择似乎是授予对GS API的访问权限或将其授予无API并在没有任何安全限制的情况下运行脚本,当我设计了几十个GS脚本来运行时,这对我来说根本不起作用有安全限制,喜欢这样.
我的问题有两个方面。首先,沙盒模型如何工作,如何影响用户脚本,从网页和用户脚本角度可以访问/看到的内容,以及如果使用其他沙盒模型会影响页面,从而能够注意到脚本已注入到页面中(或不)。其次,如何将脚本注入到页面中,并且页面可以检测到它?
据我所知,当您使用时@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。因此,主要的问题是,篡改猴子本身 …
javascript ×3
tampermonkey ×2
closures ×1
firefox ×1
greasemonkey ×1
iife ×1
jquery ×1
sandbox ×1
userscripts ×1