是否可以在设置'X-Frame-Options'到'同源'使用用户脚本



在用户脚本的上下文中,例如由Tampermonkey执行的脚本,是否可以在将"X-Frame-Options"设置为"SAMEORIGIN"的不同域的两个页面之间进行通信?

我知道通过使用iFrame和postMessage将消息从一个页面发送到另一个页面的这种方式,但当使用你无法控制的网站时,比如在我的案例中的Stack Overflow和Google(使用机器人为自己自动化某些东西),你在尝试创建iFrame时会遇到SAMEORIGIN错误。

但我想,既然我可以在两个页面中插入脚本,那么可能会找到一些变通方法或替代解决方案。

一个建议是,共享工作者看起来很有希望,但似乎要求页面来自同一来源。此外,我还查看了广播频道API规范,但它还没有在任何地方实现,而且它似乎也绑定到相同的源策略。

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

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替换谷歌的xmlhttpRequest,但我不确定这是否可以实现,因为如果你加载GM函数,用户脚本将在沙盒中运行,如果我理解正确,就无法与页面脚本交互。我只是不确定。

另一方面,如果我们能欺骗iframe's内容,将google.com视为请求的域,尽管我们正在做生意,但似乎不存在这种事情的例子,所以我很难弄清楚如何实现它。

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

  1. 由于它是一个用户脚本,您可以访问称为GM函数的特殊函数。使用GM_xmlhttpRequest,我们可以发送忽略同源策略的请求,从而允许我们在iFrame中加载第三方页面,从而允许通过postMessage在帧之间进行通信。这样做的好处是不需要重新加载页面,但坏处是,您必须动态修改框架的本地xmlhttpRequest来执行GM_xmlhttpRequest并指定完整的目标URL,而不仅仅是/example.js这样的路径,否则外部窗口的域将用于内部框架发出的任何请求
  2. 我们可以通过打开与您想要通信的页面来源相同的选项卡来使用URL查询。然后,我们可以使用共享网络工作者将消息发布到该域以前打开的任何页面,并将URL查询中的数据发送到您想要的页面。优点是你不必动态修改页面的脚本,但缺点是你必须为不同域之间的每条消息打开一个新的选项卡

最新更新