在开发这个小用户脚本时,我遇到了一个问题。当我想用我的脚本阻止所有运行中的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>容器调用时不一样。有人能解释一下为什么吗?
发布于 2012-05-31 05:42:48
见“Chrome用户脚本是否与全局名称空间分离,如Greasemonkey脚本?”。Chrome用户脚本/内容脚本和Greasemonkey脚本都从页面的javascript中分离出来。这是为了防止你被黑,但它也减少冲突和意外的副作用。
但是,每个浏览器的方法是不同的。
火狐:
@grant none生效(从GM1.0开始)。unsafeWindow来访问目标页面的javascript。但是请注意,敌对的网站管理员可能会跟踪unsafeWindow的使用,回到脚本的上下文中,从而获得更高的特权来攻击您。Chrome:
unsafeWindow的对象,其兼容性非常有限,但该对象不提供对目标页面JS的任何访问。它与脚本作用域中的window相同(在页面作用域中不是window )。也就是说,如果正确实现的话,使用unsafeWindow的脚本版本应该可以在火狐中工作。在Chrome上使用坦佩猴子的延伸可能有效,但我现在不打算再检查一遍。
当您执行“技巧”(var script = document.createElement("script"); ...)时,您是将代码注入目标页面。这绕过了沙箱,是普通Chrome用户脚本上与页面的JS交互的唯一方法。
注入优势:
注入缺陷:
GM_函数--特别是GM_xmlhttpRequest() --提供的增强特权(特别是跨域权限)。
请注意,目前Chrome完全、本地只支持GM_addStyle、GM_xmlhttpRequest、GM_log和GM_openInTab。
然而,Tamper猴子几乎完全支持GM_函数。@require那么简单。
@require还通过本地副本运行外部JS --加速执行,并且几乎消除了对外部服务器的依赖。https://stackoverflow.com/questions/10824697
复制相似问题