我知道 Greasemonkey 脚本自动包装在匿名函数中以某种方式隔离,以防止它们与页面中的脚本冲突。
Chrome 用户脚本是否也会发生同样的情况?
最佳答案
是的,Greasemonkey 脚本是 normally wrapped in an anonymous function .而且,Chrome userscripts apparently are too .
但是,更重要的是,Greasemonkey 脚本通常1 包裹在XPCNativeWrapper 中沙盒,而谷歌浏览器将用户脚本转换为扩展,they operate in an arena that Google calls an "isolated world" 2.
因此,出于安全目的,您不需要将脚本代码包装在匿名函数中,它们已经受到保护。
请注意:
- 如果您直接将代码注入(inject)页面(创建一个
<script>
标记),那么页面的 JS 可以看到该代码。 - 如果您使用
unsafeWindow
,那么该页面理论上可以跟随它返回并获得略微提升的特权。
风险非常低,而且我还没能在野外找到任何记录在案的漏洞。
~~~
最重要的是,脚本在两种浏览器中的隔离程度不同。 (而且不仅仅是通过匿名函数包装。)
Greasemonkey 有 a nice set of privileged features可用,在 Firefox 中。而 Chrome 中的用户脚本受到更多限制。
但是,通过使用 Tampermonkey extension,GM 的大部分功能都恢复到 Chrome。 .
1 截至 Greasemonkey version 1.0 (August 24, 2012),沙箱由the @grant
directive控制.如果脚本以(或默认为)@grant none
运行,则不使用沙箱。该脚本仅在私有(private)范围内运行,而正常的 GM_
, API 函数将不起作用。
2 这听起来不是比一些讨厌的沙箱更大/更好吗? (^_^)
.
关于javascript - Chrome 用户脚本是否与 Greasemonkey 脚本一样与全局命名空间分开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6617361/