简略翻译
请参阅Chrome用户脚本是否与Greasemonkey脚本一样具有隔离?” Chrome用户脚本和Greasemonkey脚本均与页面的javascript隔离。这样做是为了帮助您避免被黑客入侵,但同时也减少了冲突和意外。
但是每种浏览器使用的方法是不同的
FireFox
从1.0开始除grant none外,在XPCNativeWrapper沙箱中运行脚本(这里版本号可能存疑,不同的文章版本号不同)
从2012年8月的1.0版开始,Greasemonkey支持两种模式:具有可用于脚本的特权API的旧模式,以及较新的无特权模式。
默认情况下,将脚本包含在匿名函数中
提供unsafewindow访问原网页的javascript功能,请注意,恶意网站作者可能会根据unsafewindow获取脚本函数使用权提升自身权限
Chrome
在isolated world(暂且称之为隔离沙箱)中运行脚本
默认情况下,将脚本包含在匿名函数中
会严格阻止脚本对页面js的访问,同样,也会严格阻止页面对脚本的访问
关于早期绕过的方法可以参考:https://bbs.tampermonkey.net.cn/thread-268-1-1.html
现在,chrome最新版本提供了一个名为unsafewindow的对象,实现了极其有限的使用性,但是这个对象不提供对页面js的访问权限
他的window作用域与脚本作用域相同,并且不再页面js作用域中
关于绕过Chrome的访问权限的三种方法
第一种参考https://bbs.tampermonkey.net.cn/thread-268-1-1.html
第二种
因为虽然执行环境是隔离的,但是dom树是共用的
创建script元素是在原始网页执行环境
延时是因为为了保证网页的完整加载再进行执行
setTimeout(function() {
var script = document.createElement('script');
script.type = 'text/javascript';
script.innerHTML = "document.body.setAttribute('data-fp', fp);";
document.head.appendChild(script);
document.head.removeChild(script);
console.log(document.body.getAttribute('data-fp'));
}, 1000);
第三种是通过href执行js代码
通过设置href来执行js脚本获取数据
setTimeout(function() {
location.href = "javascript:document.body.setAttribute('data-fp', fp);";
setTimeout(function() {
console.log(document.body.getAttribute('data-fp'));
}, 0);
}, 1000);
参考文章
Why is window (and unsafeWindow) not the same from a userscript as from a tag?
https://stackoverflow.com/questions/10824697/why-is-window-and-unsafewindow-not-the-same-from-a-userscript-as-from-a-scrip
在Chrome插件中访问原始网页中的变量
https://www.keakon.net/2011/11/02/%E5%9C%A8Chrome%E6%8F%92%E4%BB%B6%E4%B8%AD%E8%AE%BF%E9%97%AE%E5%8E%9F%E5%A7%8B%E7%BD%91%E9%A1%B5%E4%B8%AD%E7%9A%84%E5%8F%98%E9%87%8F