【问题标题】:Are Chrome user-scripts separated from the global namespace like Greasemonkey scripts?Chrome 用户脚本是否与 Greasemonkey 脚本等全局命名空间分开?
【发布时间】:2011-07-07 21:28:12
【问题描述】:

我知道 Greasemonkey 脚本自动包装在匿名函数中以某种方式隔离,以防止它们与页面中的脚本发生冲突。

Chrome 用户脚本也会发生同样的情况吗?

【问题讨论】:

    标签: javascript google-chrome greasemonkey anonymous-function userscripts


    【解决方案1】:

    是的,Greasemonkey 脚本是 normally wrapped in an anonymous function。还有,Chrome userscripts apparently are too

    但是,更重要的是,Greasemonkey 脚本通常1包裹在 XPCNativeWrapper 沙箱中,而 Google Chrome 将用户脚本转换为扩展程序,而 they operate in an arena that Google calls an "isolated world" 2.

    因此,出于安全目的,您无需将脚本代码包装在匿名函数中,它们已经受到保护。

    请注意:

    1. 如果您将代码直接注入页面(创建<script> 标签),那么该代码可以被页面的 JS 看到。
    2. 如果您使用unsafeWindow,则该页面理论上可以跟随它并获得略微提升的权限。

    风险非常低,我无法在野外找到任何记录在案的漏洞利用。

    ~~~
    底线是,脚本在两种浏览器中的隔离程度不同。 (而不仅仅是被包裹在匿名函数中。)

    Greasemonkey 在 Firefox 中提供 a nice set of privileged features。虽然 Chrome 中的用户脚本受到更多限制。

    不过,GM 的大部分功能都通过Tampermonkey extension 恢复到 Chrome。




    1 截至Greasemonkey version 1.0(2012 年 8 月 24 日),沙盒由the @grant directive 控制。如果脚本以(或默认为)@grant none 运行,则不使用沙箱。该脚本仅在私有范围内运行,而普通的GM_,API 函数将不起作用。

    2 这听起来不是比一些讨厌的沙盒更大/更好吗? (^_^)

    .

    【讨论】:

    • 感谢您提供信息丰富的答案!所以我不需要将我的代码包装在 Chrome 或greasemonkey Userscript 中的匿名函数中,对吗?
    • 实际上 GreasemonkeyChromium 都将用户脚本包装在匿名函数中(尽管 Greasemonkey 尊重 @unwrap 元数据键,而 Chromium 不这样做)。
    • 啊,所以它们被包裹在匿名函数中在 Greasemonkey 中沙盒! @unwrap docs
    • @Ventero,我的立场是正确的;谢谢!由于您没有做出自己的答案,我将您的更正纳入我的。
    • 是否有充分的理由将该功能嵌入到页面中?这将添加到 pages 全局对象...我问是因为我已经看到它在许多脚本中完成并想知道它背后的原因。
    猜你喜欢
    • 2011-10-04
    • 2022-08-24
    • 2011-11-02
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多