网站可以知道我是不是正在运行用户脚本吗?
Posted
技术标签:
【中文标题】网站可以知道我是不是正在运行用户脚本吗?【英文标题】:Can a website know if I am running a userscript?网站可以知道我是否正在运行用户脚本吗? 【发布时间】:2012-01-22 19:18:47 【问题描述】:例如,Facebook.com 是否可以在我的浏览器上运行版本控制脚本并确定我是否使用脚本运行更改后的 html 代码?
这是否可以通过一个脚本来完成,该脚本可以读取缓存中的 HTML 代码并生成某种哈希标记,然后将其发送回服务器并与发送到客户端的代码进行比较?
【问题讨论】:
Facebook 不是静态 HTML,因此,哈希是无用的,因此是不可能的。 您有理由相信 Facebook 正在检测您的用户脚本吗?如果是这样,为什么?你怎么怀疑这个? Facebook 并不关心您的用户脚本,事实上 - 仅他们频繁的界面更改就可以帮助他们抵御许多用户脚本,尤其是那些没有积极维护的用户脚本。 【参考方案1】:是的,理论上,网站可以在各种情况下推断出脚本的存在。
这不是万无一失的,而且对于网站的微不足道的“威胁”通常太麻烦了。 (话又说回来,有些网站管理员可能对这些事情有强迫症。;))
一些方法,取决于脚本的作用(不分先后):
游戏或拍卖网站可以监控“投标”点击的时间(速度和规律)。
网站可以通过 AJAX 回传 <script>
节点的计数,以寻找额外信息。
同样,网站可以 AJAX 支持页面的任何或所有内容并将其与预期值进行比较。
可以记录额外的 AJAX 调用或不满足隐藏要求的 AJAX 调用(并允许显示为成功)。
如果脚本以正确(错误)的方式使用unsafeWindow
,则a page can detect that and even hijack (slightly) elevated privileges。
可以检测到之前没有鼠标悬停事件的“点击”。我实际上已经在野外看到过这个。
A page's javascript can often detect script-generated clicks (etc.) 与用户生成的不同。 (感谢c69 的提醒。)
不过,最终优势在于用户脚本编写者。网页采取的任何反制措施都可以在用户端被检测和阻止。即使是定制的、所需的插件或所需的硬件加密狗也可以被熟练和积极的用户颠覆。
【讨论】:
在 Opera 中,页面现在可以检测虚假点击(通过.isTrusted
属性),可能很快就会在其他浏览器中实现。
@c69,它是been possible in Firefox for a while,在 IE9 中的支持有限。
@MikeOrtiz,不。用户脚本本身位于页面无法看到的单独范围内——即使在@grant none
模式下也是如此。 ...如果用户脚本创建<script>
节点,那么页面可以看到那些的来源。
@MikeOrtiz,视情况而定。如果需要,请打开一个新问题。请务必包含 MCVE。【参考方案2】:
更新:以下方法自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,不,这不再有效,请参阅更新的答案。以上是关于网站可以知道我是不是正在运行用户脚本吗?的主要内容,如果未能解决你的问题,请参考以下文章
PHP,暂停脚本执行,直到另一个正在运行的脚本发出事件信号?