网站可以知道我是否正在运行用户脚本吗?

IT技术 javascript facebook greasemonkey userscripts tampermonkey
2021-01-19 08:23:37

例如,Facebook.com 是否可以在我的浏览器上运行版本控制脚本,并使用脚本查看我是否正在运行更改过的 HTML 代码?

这是否可以通过一个脚本来完成,该脚本可以读取缓存中的 HTML 代码并生成某种散列标签,然后将其发送回服务器并与发送到客户端的代码进行比较?

2个回答

是的,理论上,一个站点可以在各种情况下推断出脚本的存在。

这不是万无一失的,通常对于站点的微不足道的“威胁”来说太麻烦了。(话又说回来,有些网站管理员可能对此类事情过于偏执。;))

一些方法,取决于脚本的作用(无特定顺序):

  1. 游戏或拍卖网站可以监控“出价”点击的时间(速度和规律)。

  2. 一个站点可以 AJAX 支持说<script>节点的数量,寻找额外的东西。

  3. 同样,站点可以 AJAX 支持页面的任何或所有内容,并将其与预期值进行比较。

  4. 额外的 AJAX 调用或不满足隐藏要求的 AJAX 调用可以被记录下来(并允许看起来成功)。

  5. 如果脚本以unsafeWindow正确(错误)的方式使用,页面可以检测到,甚至劫持(稍微)提升的权限

  6. 可以检测到不是鼠标悬停事件之前的“点击”。我实际上已经看到它在野外使用。

  7. 页面的 javascript 通常可以检测到脚本生成的点击(等)与用户生成的点击不同。(谢谢c69的提醒。)

然而,最终优势在于用户脚本编写者。网页采取的任何对策都可以在用户端被检测到并阻止。即使是自定义的、必需的插件或必需的硬件加密狗,也可能被熟练和有动力的用户破坏。

@c69,它在 Firefox 中已经有一段时间了,并且在 IE9 中支持有限。
2021-03-21 08:23:37
@MikeOrtiz,不。用户脚本本身位于页面无法看到的单独范围内——即使在@grant none模式下。...如果用户脚本创建了<script>节点,那么页面可以看到那些.
2021-03-21 08:23:37
@MikeOrtiz,视情况而定。如果需要,请打开一个新问题。请务必包含 MCVE。
2021-03-27 08:23:37
在 Opera 中,页面现在可以检测虚假点击(通过.isTrusted属性),可能很快就会在其他浏览器中实现。
2021-04-11 08:23:37

更新:从Greasemonkey 3.3 开始,以下方法完全无效



请参阅(死链接)How-to Detect Greasemonkey

用于检测是否安装了GM 的 Javascript (但不是脚本是否实际在该页面上运行):

过时的选项 1:

if (Components.interfaces.gmIGreasemonkeyService) {
  alert("I smell a monkey!");
}


过时的选项 2:

<script type="text/javascript" src="resource://greasemonkey/addons4.js"></script>
<script type="text/javascript">
if (typeof GM_addonsStartup !== "undefined") {
  alert("I smell a monkey!");
}
</script>
@Edge,不,这不再有效,请参阅更新的答案。
2021-04-04 08:23:37