gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:47:22 26 4
gpt4 key购买 nike

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

我知道 this way通过使用 iFrame 和 postMessage 将消息从一个页面发送到另一个页面,但是在使用您无法控制的网站时,例如在我的情况下 Stack Overflow 和 Google(正在开发一个机器人来为我自己自动化一些东西),尝试创建 iFrame 时,您会收到 SAMEORIGIN 错误。

但我认为,由于我能够在两个页面中插入脚本,因此可能会采取一些变通方法或替代解决方案。

一个建议,一个shared worker看起来很有希望,但似乎要求页面来自同一来源。我还看了 Broadcast Channel API spec,但它还没有在任何地方实现,而且它似乎也被绑定(bind)到同源策略。

到目前为止在评论中提到的另一个建议的可能性是使用 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 条路线:

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

关于javascript - 是否可以使用用户脚本在将 'X-Frame-Options' 设置为 'SAMEORIGIN' 的页面(选项卡)之间进行通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38691034/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com