我面临的一个问题,而开发这个小userscript 。 当我想阻止每一个XMLHttpRequest
从运行的网站,我的剧本,什么也没有发生(在Chrome至少):
function main() {
// Override XHR.open with a custom function
window.XMLHttpRequest.prototype.open = function() {
// Nothing... so it's supposed to block every xhr.open() call
}
}
main();
更换时同样的事情window
的unsafeWindow
。
然而,当我用这个小动作,一切工作就像一个魅力:
// No more call to main(), and:
var script = document.createElement("script");
script.textContent = "(" + main.toString() + ")();";
document.body.appendChild(script);
每次调用xhr.open
是我的自定义功能,没有更多的AJAX所取代。
所以我猜这个window
元素是不是在同一main
从脚本中调用时相比,它是从一个叫<script></script>
容器。 有人可以解释我为什么?
请参见“从像Greasemonkey脚本全局命名空间分离的Chrome用户的脚本?” 。 两个镀铬userscripts /内容脚本和Greasemonkey脚本,从页面的JavaScript隔离。 这样做是为了防止您被黑客攻击,而且也减少了冲突和意想不到的副作用。
然而,这些方法对于每个浏览器不同...
火狐:
- 运行在脚本的XPCNativeWrapper沙箱 ,除非
@grant none
生效(如GM 1.0)。 - 包装在默认情况下,匿名函数的脚本。
- 提供
unsafeWindow
访问目标网页的JavaScript。 但要注意,这是可能的敌对站长遵循unsafeWindow
使用回脚本的上下文中,从而获得更高的权限一起PWN你。
铬:
- 运行脚本“分离的世界” 。
- 包装在一个匿名函数的脚本。
- 严格块由脚本,反之亦然页面的JS任何访问。
Chrome浏览器的最新版本现在提供了一个名为对象unsafeWindow
,对于非常有限的兼容性,但这种对象不提供到目标页面的JS任何访问。 这是一样的window
在脚本范围(这不是window
的页面范围内)。
这就是说,你的脚本中使用的版本unsafeWindow
应该如果正确实施在Firefox上/工作。 也许工作使用的Tampermonkey扩展在Chrome,但我不会去仔细检查现在。
当你这样做的“绝招”( var script = document.createElement("script"); ...
),你是注入代码到目标页面。 这绕过沙盒,是在正常的Chrome userscript的脚本与页面的JS交互的唯一途径。
注射的优点:
- 非Tampermonkey的唯一方法userscripts访问由目标页面提供的对象或功能。
- 几乎总是浏览器,火狐,Opera等(IE还是一如既往的,别的东西。)之间完全兼容
- 通常更容易调试整个脚本; 开发工具正常工作。
注射的缺点:
该脚本,至少注入的部分,不能使用由所提供的增强的权限(尤其跨域) GM_
功能-特别是GM_xmlhttpRequest()
需要注意的是目前的Chrome只支持GM_addStyle
, GM_xmlhttpRequest
, GM_log
和GM_openInTab
,充分,本身。
Tampermonkey支持GM_
功能几乎完全,但是。
可引起副作用或冲突与页面的JS。
使用外部库,甚至引入更多的冲突和时序问题。 这是隔靴搔痒一样容易@require
。
@require
,也运行从一个本地副本外部JS -加快执行和几乎消除外部服务器上的依赖。
该页面可以看到,使用,变更,或者阻止脚本。
需要JS启用。 Firefox的Greasemonkey的,特别是能已JS阻止的网页上运行。 这可以在臃肿,蹩脚,和/或侵入性的网页进行天赐。