Javascript 是否可以在设置';X-Frame-Options';至';SAMEORIGIN';使用用户脚本?

Javascript 是否可以在设置';X-Frame-Options';至';SAMEORIGIN';使用用户脚本?,javascript,iframe,Javascript,Iframe,在用户脚本(例如由Tampermonkey执行)的上下文中,是否可以在将“X-Frame-Options”设置为“SAMEORIGIN”的不同域的两个页面之间进行通信 我知道使用iFrame和postMessage将消息从一个页面发送到另一个页面的方法,但是当使用您无法控制的站点时,例如在我的案例中,Stack Overflow和Google(使用机器人为我自己实现自动化),在尝试创建iFrame时,您会遇到SAMEORIGIN错误 但我认为,既然我能够在两个页面中插入脚本,就有可能找到一些变通

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

我知道使用iFrame和
postMessage
将消息从一个页面发送到另一个页面的方法,但是当使用您无法控制的站点时,例如在我的案例中,Stack Overflow和Google(使用机器人为我自己实现自动化),在尝试创建iFrame时,您会遇到
SAMEORIGIN
错误

但我认为,既然我能够在两个页面中插入脚本,就有可能找到一些变通方法或替代解决方案

一个建议,a看起来很有希望,但它似乎要求页面来自同一来源。我还查看了规范,但它还没有在任何地方实现,而且它似乎也绑定到同源策略

评论中提到的另一个建议可能性是使用,因为这是一个用户脚本(扩展/特殊JS特性)。使用,我们可以忽略跨域限制并加载
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);
});
GM\u xmlhttpRequest({
方法:“获取”,
url:“https://www.google.com",
标题:{
“用户代理”:“Mozilla/5.0”,
“接受”:“文本/xml”
},
onload:函数(响应){
$('html').html(“”);
$(“#iframe”).contents().find('html').html(response.responseText);
});
也许我可以编辑搜索请求,特别指向
google.com
,而不是让搜索采用父页面的域。如果由于同源策略的某些挂起而失败,我甚至可以尝试用
GM_xmlhttpRequest
替换谷歌的
xmlhttpRequest
,但我不确定至少可以这样做,因为如果你加载GM函数,用户脚本将在沙箱中运行,如果我理解正确,就无法与页面脚本纠缠在一起。我只是不确定


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

是的,这是可能的,通过两种途径:

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

  • 同一来源阻止浏览器加载页面。没有插入脚本的地方,总是有
    GM.*
    功能。我相信Tampermonkey支持您需要的功能。“但我想既然我可以在两个页面中插入脚本”如果您能够将
    插入到两个文档中,您可以尝试使用
    SharedWorker
    @AlexeyTen他们正在谈论用户脚本:不要担心沙箱。首先,您总是在沙箱中运行。其次,它主要是为您提供一致的环境第三,你可以访问
    unsafeWindow
    ,这是页面自己的全局范围,你可以从中访问几乎所有你想要的东西——如果你把东西放在那里,页面就可以访问它。