javascript – 是否可以在使用用户脚本将“X-Frame-Options”设置为“SAMEORIGIN”的页面(选项卡)之间进行通信?

前端之家收集整理的这篇文章主要介绍了javascript – 是否可以在使用用户脚本将“X-Frame-Options”设置为“SAMEORIGIN”的页面(选项卡)之间进行通信?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
用户脚本的上下文中,例如由Tampermonkey执行,是否可以在将“X-Frame-Options”设置为“SAMEORIGIN”的两个不同域的页面之间进行通信?

我知道大约this way通过使用iFrames和postMessage将消息从一个页面发送到另一个页面,但是当您使用不需要控制的站点时,就像在我的情况下Stack Overflow和Google(在机器人上自动完成某些操作),您将尝试创建iFrame时,得到SAMEORIGIN错误.

但是我认为,因为我可以在两个页面中插入脚本,所以可能会拉出一些解决方法或备用解决方案.

一个建议,shared worker看起来很有希望,但似乎要求页面来自相同的起源.另外我看了一下Broadcast Channel API规范,但是它还没有实现,而且似乎也受到同一起源策略的约束.

评论中提到的另一个建议的可能性是使用GM API,因为这是一个用户脚本(扩展/特殊的JS功能).使用GM_xmlhttpRequest,我们可以忽略跨域限制并加载google.com,然后将其放在iframe中,但所有来源将指向嵌入iframe的站点,因此在Google页面搜索会尝试在父级上执行搜索参数网站的域名.

GM_xmlhttpRequest({
    method: "GET",url: "https://www.google.com",headers: {
        "User-Agent": "Mozilla/5.0","Accept": "text/xml"
    },onload: function(response) {
        $('html').html('<iframe id="iframe"></iframe>');
        $("#iframe").contents().find('html').html(response.responseText);
});

也许我可以编辑搜索请求来指向google.com,而不是让搜索采用父页面的域.如果由于某些挂起原因相同的原因,我甚至可以尝试用GM_xmlhttpRequest替换Google的xmlhttpRequest,但是如果您加载GM功能,则不能确定是否可以执行该操作,否则将运行一个沙盒,如果我理解正确,就无法与页面脚本交织在一起.我只是不确定

另一方面,如果我们可以欺骗iframe的内容来将google.com视为请求域名,尽管我们正在开展业务,但是这样的事情似乎并不存在,但是我遇到了麻烦弄清楚如何使它发生.

解决方法

是的,可以通过2条路线:

>由于它是一个用户脚本,您可以访问称为GM功能的特殊功能.使用GM_xmlhttpRequest,我们可以发送一个忽略相同原始策略的请求,允许我们将第三方页面加载到iFrame中,从而允许通过postMessage进行帧之间的通信.关于这件事的好处是没有页面重新加载,但不好的是,您必须动态修改框架的本机xmlhttpRequest才能执行一个GM_xmlhttpRequest并指定完整的目标URL,而不仅仅是路径,例如/example.js,否则外部窗口的域将用于内部框架所做的任何请求.>我们可以通过打开与要与之进行通信的页面相同来源的标签来使用URL查询.然后,我们可以使用共享的网络工作者将消息发布到该域的任何先前打开的页面,并将数据从URL查询发送到所需的页面.专业人士您不必动态修改页面的脚本,但缺点是您必须为不同域之间的每个消息打开一个新的选项卡.

猜你在找的JavaScript相关文章