javascript - 网页可以检测到篡改用户脚本吗?

标签 javascript google-chrome sandbox tampermonkey userscripts

我的问题有两个方面。 首先,沙箱模型如何工作,如何影响用户脚本,从网页和用户脚本的 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
  • Tampermonkey actually provides the installed script version到在高级设置中列入白名单的网站。这主要是针对脚本宿主,例如greasyfork.org。
  • 我不知道页面是否可以检测到用户脚本正在使用的WebSocket。我对此表示怀疑。

  • 底线是“只读”用户脚本
    ,不是require模式下的@grant none全局库,页面无法检测到
    (除非页面是greasyfork.org等,并且您的Allow communication with cooperate pages设置为默认值。)

    如果您发现某个泄漏,从而使页面可以检测到“被动”脚本,请告知我们,并且很可能将其插入。

    关于javascript - 网页可以检测到篡改用户脚本吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56821042/

    相关文章:

    javascript - 是否可以在 Google Calendar API 中发送/插入事件数组

    javascript - 从 Google 表格循环

    javascript - Ajax 调用不接受带有撇号的名称作为参数

    javascript - 如何从 Chrome 中的代码设置 JavaScript 断点?

    Paypal IPN 验证 - 尽管已到达成功页面但仍不起作用

    javascript - 如何与 Chrome 打包 App 中的沙盒窗口通信?

    javascript - 从外部js文件获取变量

    javascript - OpenLayers SVG 在 Chrome 中动画,但在 FIrefox 中不动画

    angular - 未绑定(bind)断点 - VS Code | Chrome | Angular

    Paypal 沙箱,我所有的英镑交易都变成了美元交易