为什么窗口(和unsafeWindow)不是从userscript如从同 tag?为什么窗口(和un

2019-05-16 17:47发布

我面临的一个问题,而开发这个小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();

更换时同样的事情windowunsafeWindow

然而,当我用这个小动作,一切工作就像一个魅力:

// 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>容器。 有人可以解释我为什么?

Answer 1:

请参见“从像Greasemonkey脚本全局命名空间分离的Chrome用户的脚本?” 。 两个镀铬userscripts /内容脚本和Greasemonkey脚本,从页面的JavaScript隔离。 这样做是为了防止您被黑客攻击,而且也减少了冲突和意想不到的副作用。

然而,这些方法对于每个浏览器不同...

火狐:

  1. 运行在脚本的XPCNativeWrapper沙箱 ,除非@grant none生效(如GM 1.0)。
  2. 包装在默认情况下,匿名函数的脚本。
  3. 提供unsafeWindow访问目标网页的JavaScript。 但要注意,这是可能的敌对站长遵循unsafeWindow使用回脚本的上下文中,从而获得更高的权限一起PWN你。

铬:

  1. 运行脚本“分离的世界” 。
  2. 包装在一个匿名函数的脚本。
  3. 严格块由脚本,反之亦然页面的JS任何访问。
    Chrome浏览器的最新版本现在提供了一个名为对象unsafeWindow ,对于非常有限的兼容性,但这种对象不提供到目标页面的JS任何访问。 这是一样的window在脚本范围(这不是window的页面范围内)。

这就是说,你的脚本中使用的版本unsafeWindow应该如果正确实施在Firefox上/工作。 也许工作使用的Tampermonkey扩展在Chrome,但我不会去仔细检查现在。

当你这样做的“绝招”( var script = document.createElement("script"); ... ),你是注入代码到目标页面。 这绕过沙盒,是在正常的Chrome userscript的脚本与页面的JS交互的唯一途径。

注射的优点:

  1. 非Tampermonkey的唯一方法userscripts访问由目标页面提供的对象或功能。
  2. 几乎总是浏览器,火狐,Opera等(IE还是一如既往的,别的东西。)之间完全兼容
  3. 通常更容易调试整个脚本; 开发工具正常工作。

注射的缺点:

  1. 该脚本,至少注入的部分,不能使用由所提供的增强的权限(尤其跨域) GM_功能-特别是GM_xmlhttpRequest()
    需要注意的是目前的Chrome只支持GM_addStyleGM_xmlhttpRequestGM_logGM_openInTab ,充分,本身。
    Tampermonkey支持GM_功能几乎完全,但是。

  2. 可引起副作用或冲突与页面的JS。

  3. 使用外部库,甚至引入更多的冲突和时序问题。 这是隔靴搔痒一样容易@require
    @require ,也运行从一个本地副本外部JS -加快执行和几乎消除外部服务器上的依赖。

  4. 该页面可以看到,使用,变更,或者阻止脚本。

  5. 需要JS启用。 Firefox的Greasemonkey的,特别是能已JS阻止的网页上运行。 这可以在臃肿,蹩脚,和/或侵入性的网页进行天赐。



文章来源: Why is window (and unsafeWindow) not the same from a userscript as from a