javascript - 为什么 Tampermonkey 仍然可以识别以“window”为前缀的变量。在沙盒环境下不报错?
问题描述
理论上,下面的示例脚本会在沙箱中执行,所以应该不会被识别。但是为什么它可以成功关闭窗口而不报错呢?
其实我知道虽然可以跑,但也只是暂时的。在 unsafewindow 中,任何定义 window obj 的全局变量的尝试都将失败,除非它是在 unsafewindow 中定义的。
// ==UserScript==
// @name temp
// @namespace no
// @match *:///*:/*/*
// @grant unsafeWindow
// @grant window.close
// ==/UserScript==
window.close();
解决方案
@grant
在用户脚本中(在 GM|TM|VM 中)指的是特别提供给用户脚本的 GM API。
@grant window.close
由 Tampermonkey 和 Violentmonkey 支持,它们将用户脚本中的window.close()
函数映射到后台函数以关闭选项卡。
换句话说,window.close()
在 VM|TM 中运行的content
作用域与window.close()
在page
上下文中运行的标准 JavaScript 不同。
此外,JavaScriptwindow.close()
只能关闭由脚本打开的窗口(requires window.opener
),而window.close()
GM API 可以关闭窗口(选项卡),即使它不是由脚本打开的。
推荐阅读
- c++ - 识别打开共享内存状态的方法
- python - 为什么不允许字符串像值一样嵌入到 f 字符串中?
- wordpress - 如何合并两个 .PO wordpress 语言文件?
- java - 使用单体项目的 Spotbugs 规则运行声纳扫描仪时出错?
- python - Pandas - 在方法链接中使用 assign 和 if-else 语句
- python - 通过理解中的连续更新创建 dict
- java - 首先在包中运行特定的测试类
- azure-language-understanding - 如何为发票数据提取设置 LUIS
- docusignapi - 将已签名的文档转发给其他收件人,以便使用 DocuSign 和 C# 在同一文档上签名
- mysql - Docker-compose 初始化数据库