例如,Facebook.com 是否可以在我的浏览器上运行版本控制脚本,并使用脚本查看我是否正在运行更改过的 HTML 代码?
这是否可以通过一个脚本来完成,该脚本可以读取缓存中的 HTML 代码并生成某种散列标签,然后将其发送回服务器并与发送到客户端的代码进行比较?
例如,Facebook.com 是否可以在我的浏览器上运行版本控制脚本,并使用脚本查看我是否正在运行更改过的 HTML 代码?
这是否可以通过一个脚本来完成,该脚本可以读取缓存中的 HTML 代码并生成某种散列标签,然后将其发送回服务器并与发送到客户端的代码进行比较?
是的,理论上,一个站点可以在各种情况下推断出脚本的存在。
这不是万无一失的,通常对于站点的微不足道的“威胁”来说太麻烦了。(话又说回来,有些网站管理员可能对此类事情过于偏执。;))
一些方法,取决于脚本的作用(无特定顺序):
游戏或拍卖网站可以监控“出价”点击的时间(速度和规律)。
一个站点可以 AJAX 支持说<script>
节点的数量,寻找额外的东西。
同样,站点可以 AJAX 支持页面的任何或所有内容,并将其与预期值进行比较。
额外的 AJAX 调用或不满足隐藏要求的 AJAX 调用可以被记录下来(并允许看起来成功)。
如果脚本以unsafeWindow
正确(错误)的方式使用,页面可以检测到,甚至劫持(稍微)提升的权限。
可以检测到不是鼠标悬停事件之前的“点击”。我实际上已经看到它在野外使用。
页面的 javascript 通常可以检测到脚本生成的点击(等)与用户生成的点击不同。(谢谢c69的提醒。)
然而,最终优势在于用户脚本编写者。网页采取的任何对策都可以在用户端被检测到并阻止。即使是自定义的、必需的插件或必需的硬件加密狗,也可能被熟练和有动力的用户破坏。
更新:从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>