0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

浏览器跨域窗口通信技术调研:window.open 与 postMessage

jf_27145353 来源:jf_27145353 作者:jf_27145353 2026-05-23 00:58 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

浏览器跨域窗口通信技术调研:window.open 与 postMessage

本调研定位 :以 2aran.com 调研文章一键分发到 syncblog.cn 内容同步页 为具体案例,解释浏览器跨域窗口通信的技术原理和安全实践。核心技术是 window.open() + window.postMessage();相关边界涉及同源策略、CORSwindow.openertargetOrigin、结构化克隆、弹窗拦截和 COOP / COEP 等浏览器安全机制。

一、核心结论

  • 同源策略是浏览器安全底座 :不同源页面之间不能随意读写 DOM、Cookie、localStorage 或 JS 对象,否则任意网站都能窃取用户在其他网站的登录态和数据。
  • CORS 解决的是跨源 HTTP 读取问题,不解决窗口之间直接传数据的问题 :前端请求 API 时才主要涉及 CORS;两个浏览器窗口之间传文章正文,更适合用 postMessage
  • postMessage 是标准跨源通信通道 :它允许一个窗口向另一个窗口发送结构化数据,常见于父页面和 iframe、主页面和弹窗、OAuth 登录回调、支付弹窗、嵌入式编辑器等场景。
  • 安全关键不在“能不能发”,而在“收不收、收谁的、收什么” :接收方必须校验 event.originevent.data.type 和数据结构;发送方必须使用明确 targetOrigin,避免把敏感内容广播给未知窗口。
  • window.open + postMessage 很适合 2aran.com → syncblog.cn 的分发场景 :2aran.com 不能直接操作 syncblog.cn 的编辑器,但可以打开 syncblog 页面,并在 syncblog 明确接收的前提下把 Markdown 发过去。
  • 不要把长 Markdown 塞进 URL 参数 :调研文章很长,query/hash 容易超过浏览器、代理或日志系统的稳定承载范围;postMessage 更稳。

二、为什么浏览器要限制跨域

浏览器里的“源”(origin)由三部分组成:

组成示例
协议https
主机名2aran.com
端口443

只有协议、主机名、端口三者都相同,才算同源。例如:

页面 A页面 B是否同源原因
https://2aran.com/articleshttps://2aran.com/about协议、主机、端口相同
https://2aran.comhttps://syncblog.cn主机不同
https://2aran.comhttp://2aran.com协议不同
http://localhost:3005http://localhost:5173端口不同

同源策略限制的是“一个源的脚本如何访问另一个源的资源”。如果没有这个限制,恶意网站可以在用户登录银行、邮箱、后台系统后,直接读取那些页面的 DOM 或接口响应。浏览器因此默认禁止跨源脚本直接读取敏感内容。

但浏览器并不是完全禁止跨域协作。现实里有很多合法需求:登录弹窗要把 token 传回主页面,支付弹窗要告诉商户支付成功,嵌入式编辑器要和宿主页面交换内容,内容平台要把文章从一个站点传到另一个站点。postMessage 就是为这类“双方明确配合”的通信设计的。

三、CORS 和 postMessage 的区别

很多跨域问题会被统称为“CORS 问题”,但 CORS 和 postMessage 解决的是不同层的问题。

技术解决对象典型场景是否适合传 Markdown 到另一个网页
同源策略(SOP)浏览器默认安全限制禁止跨源页面互相读取敏感数据是背景规则,不是通信方案
CORS跨源 HTTP 请求读取响应fetch('https://api.example.com')不适合直接填充另一个网页的编辑器
JSONP旧式跨源脚本加载老接口兼容不建议新项目使用
postMessage跨窗口 / iframe 消息通信弹窗、iframe、OAuth、编辑器嵌入适合
URL query / hash启动参数传递传短 token、短配置不适合长文章
localStorage同源本地存储保存草稿、配置跨源不可写
BroadcastChannel同源上下文广播同站多个 tab 同步不能跨源

在 2aran.com → syncblog.cn 的案例里,目标不是请求一个 API 返回数据,而是让另一个已经打开的网页把 Markdown 写进自己的编辑器。因此核心不是 CORS,而是跨窗口消息通信。

四、postMessage 的基本机制

window.postMessage() 的基本形式是:

targetWindow.postMessage(message, targetOrigin)

其中:

参数含义
targetWindow目标窗口引用,例如window.open()返回的新窗口、iframe.contentWindowwindow.openerwindow.parent
message要传的数据,可以是字符串、对象、数组、Blob、ArrayBuffer 等可结构化克隆的数据
targetOrigin明确允许接收消息的目标源,例如https://syncblog.cn

接收方监听:

window.addEventListener('message', (event) = > {
  if (event.origin !== 'https://2aran.com') return
  if (event.data?.type !== 'SYNCBLOG_IMPORT_ARTICLE') return

  editor.importContent(event.data.markdown)
})

message 事件里最重要的字段:

字段含义用法
event.origin发送方来源必须校验
event.source发送方窗口引用可用于回信
event.data发送的数据必须校验类型和结构

这套机制的关键是:浏览器允许“发消息”,但是否接收、如何处理,完全由目标页面自己决定。

五、window.open + opener 的通信模型

当页面 A 打开页面 B:

const popup = window.open('https://syncblog.cn/md/#content-sync')

页面 A 会拿到 B 的窗口引用 popup。即使 A 和 B 不同源,A 不能直接读写 B 的 DOM,但可以对 B 调用 postMessage

popup.postMessage(payload, 'https://syncblog.cn')

页面 B 也可以通过 window.opener 找到打开自己的页面 A:

window.opener?.postMessage({ type: 'SYNCBLOG_IMPORT_READY' }, 'https://2aran.com')

因此一个稳健流程通常会设计成“握手”:

步骤发起方动作
12aran.com用户点击“分发”,调用window.open()打开 syncblog
2syncblog.cn页面加载后通过window.opener.postMessage()发送 ready
32aran.com收到 ready 后用popup.postMessage()发送文章 payload
4syncblog.cn校验 origin、type、数据结构后导入 Markdown
5syncblog.cn可选:回传 received / imported,给来源页面显示成功状态

这种握手机制比“打开后马上发”稳定,因为目标页面加载、前端框架初始化、编辑器挂载都需要时间。

六、2aran.com → syncblog.cn 的推荐协议

建议把消息协议设计成版本化对象,而不是裸字符串。

{
  version: 1,
  source: '2aran.com',
  type: 'SYNCBLOG_IMPORT_ARTICLE',
  title: '6G 网络前沿技术行业调研(2026)',
  summary: '围绕 6G / IMT-2030 的主流技术方向...',
  canonicalUrl: 'https://2aran.com/articles/research/topics/6g-network-frontier-technologies',
  category: 'topics',
  slug: '6g-network-frontier-technologies',
  tags: ['6G', 'IMT-2030', '通信网络'],
  markdown: '# 6G 网络前沿技术行业调研(2026)nn...',
  importedAt: '2026-05-23T...Z'
}

字段说明:

字段是否必须用途
version协议升级兼容
type消息路由,避免和其他 postMessage 混淆
source业务来源标记
title填充 syncblog 文章标题或草稿名
markdown文章正文
canonicalUrl建议作为原文链接、转载来源、后续回链
summary可选作为描述、摘要或发布前说明
tags可选转换为平台标签、话题或内部分类
category/slug可选方便追踪来源文章

syncblog 侧可以把 title 写入草稿标题,把 markdown 写入编辑器,把 canonicalUrl 作为来源链接保存。后续如果要做“分发记录回写”,还可以在消息里加入 requestId,syncblog 导入成功后把 requestId 回传给 2aran.com。

七、安全边界与常见坑

7.1 发送方不要用 * 作为 targetOrigin

错误写法:

popup.postMessage(payload, '*')

如果弹窗被重定向到恶意页面,或者目标窗口被替换,敏感内容可能发给错误页面。更安全的写法是明确目标源:

popup.postMessage(payload, 'https://syncblog.cn')

只有目标窗口当前 origin 匹配时,浏览器才会投递消息。

7.2 接收方必须校验 origin

错误写法:

window.addEventListener('message', (event) = > {
  editor.importContent(event.data.markdown)
})

这等于任何网页都能向 syncblog 塞内容。正确做法:

const allowedOrigins = new Set([
  'https://2aran.com',
  'https://tuaran.me',
  'http://localhost:3005',
])

window.addEventListener('message', (event) = > {
  if (!allowedOrigins.has(event.origin)) return
  if (event.data?.type !== 'SYNCBLOG_IMPORT_ARTICLE') return
  if (typeof event.data.markdown !== 'string') return

  editor.importContent(event.data.markdown)
})

7.3 不要把收到的 HTML 直接 innerHTML

如果传的是 Markdown,syncblog 会经过自己的 Markdown 渲染器处理;如果传的是 HTML,则要格外小心 XSS。更稳的方案是只接收 Markdown,不接收任意 HTML。

7.4 注意 noopener 会切断 opener

为了防止反向标签劫持,很多链接会加 rel="noopener"。但如果用 noopener 打开新窗口,新窗口拿不到 window.opener,就不能主动回 ready。

这不是说不能用 noopener,而是要看通信模式:

打开方式opener 是否可用适合场景
window.open(url, 'name')通常可用需要双向握手
``不可用只打开外链,不通信

如果安全要求必须 noopener,可以改成“来源页定时向弹窗 postMessage”,不依赖 ready 回传,但可靠性会差一些。

7.5 COOP / COEP 可能影响弹窗通信

Cross-Origin-Opener-Policy(COOP)会影响跨源窗口之间的 opener 关系。如果某站点设置了严格的 COOP,可能导致弹窗和打开者被放进不同 browsing context group,从而让 window.opener 断开。对于需要窗口通信的产品,要在安全隔离和跨窗口协作之间做取舍。

八、和 iframe 通信的区别

postMessage 不只用于弹窗,也常用于 iframe。

模式通信路径适合场景
父页面 → iframeiframe.contentWindow.postMessage()嵌入第三方编辑器、地图、支付组件
iframe → 父页面window.parent.postMessage()子应用通知宿主状态
主页面 → 弹窗popup.postMessage()登录、支付、导入工具
弹窗 → 主页面window.opener.postMessage()回传授权结果、导入 ready、支付结果

iframe 的优势是不会离开当前页面,可以做嵌入式体验;缺点是复杂 UI 会受容器大小、焦点、滚动和权限限制影响。弹窗的优势是目标应用完整打开,适合 syncblog 这种复杂编辑器。

九、工程落地建议

对于 2aran.com 与 syncblog.cn,建议采用“弹窗 + ready 握手 + postMessage + 剪贴板兜底”的方案。

能力设计
入口调研页新增“分发”按钮
目标地址线上https://syncblog.cn/md/#content-sync;本地http://localhost:5173/md/#content-sync
握手syncblog 加载后发送SYNCBLOG_IMPORT_READY
传输2aran.com 发送SYNCBLOG_IMPORT_ARTICLE
校验syncblog 校验event.originevent.data.typemarkdown类型
填充syncblog 将markdown写入编辑器,将title写入草稿标题
兜底如果弹窗被拦截或没有 ready,2aran.com 自动复制 Markdown

发送方伪代码:

const popup = window.open('https://syncblog.cn/md/#content-sync', 'syncblog-distribute')

window.addEventListener('message', (event) = > {
  if (event.origin !== 'https://syncblog.cn') return
  if (event.data?.type !== 'SYNCBLOG_IMPORT_READY') return

  popup.postMessage({
    type: 'SYNCBLOG_IMPORT_ARTICLE',
    title,
    markdown,
    canonicalUrl,
    tags,
  }, 'https://syncblog.cn')
})

接收方伪代码:

window.opener?.postMessage({
  type: 'SYNCBLOG_IMPORT_READY',
  app: 'syncblog.cn',
}, 'https://2aran.com')

window.addEventListener('message', (event) = > {
  if (event.origin !== 'https://2aran.com') return
  if (event.data?.type !== 'SYNCBLOG_IMPORT_ARTICLE') return
  if (typeof event.data.markdown !== 'string') return

  setCurrentPostTitle(event.data.title)
  editor.importContent(event.data.markdown)
})

十、综合判断

postMessage 是前端工程里非常重要但容易被误用的能力。它不是“突破浏览器安全限制”,而是在同源策略之上提供一条受控的协作通道:发送方必须拿到目标窗口引用并指定目标源,接收方必须显式监听、校验来源和消息结构,然后决定是否处理。

对内容工具而言,这类能力很实用。2aran.com 负责生成和沉淀调研内容,syncblog.cn 负责排版、预览和多平台分发。两者不需要共享数据库,也不需要让一个站点直接控制另一个站点;只要用 postMessage 建立一次用户触发的导入动作,就能完成“从知识库到内容分发工作台”的顺滑跳转。

一句话判断:跨域窗口通信的正确姿势,不是绕过浏览器限制,而是让两个可信应用在浏览器允许的安全边界内明确握手、明确传输、明确校验。

十一、信息来源与参考

  • MDN:Window.postMessage(),[https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage]
  • MDN:Same-origin policy,[https://developer.mozilla.org/en-US/docs/Web/Security/Defenses/Same-origin_policy]
  • MDN:Window.open(),[https://developer.mozilla.org/docs/Web/API/Window/open]
  • WHATWG HTML Standard:Cross-document messaging,[https://html.spec.whatwg.org/dev/web-messaging.html]
  • web.dev:Security headers quick reference,[https://web.dev/articles/security-headers]
  • web.dev:A guide to enable cross-origin isolation,[https://web.dev/articles/cross-origin-isolation-guide]

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 通信技术
    +关注

    关注

    20

    文章

    1180

    浏览量

    94634
  • AI
    AI
    +关注

    关注

    91

    文章

    41976

    浏览量

    303065
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    问题是由浏览器的同源策略造成的

    浏览器
    jf_62215197
    发布于 :2024年08月27日 07:51:42

    11个你应当使用FIREFOX浏览器的理由

    弹出式窗口。 当浏览器拦截弹出式窗口中时会在状态栏里显示信息图标来通知您,告诉你它已经阻止了打开弹出式窗口平台运行。IE只会运行在
    发表于 11-26 16:31

    IE浏览器出错故障分析

    使用 ie 浏览器浏览网页时,出现“该程序执行了非法操作,即将关闭……”的错误提示对话框。此时单击“确定”按钮后会弹出一个提示“发生内部错误……”的对话框,再单击“确定”后所有打开的 ie 浏览器
    发表于 01-06 14:46

    Internet Wander 飓风浏览器3.8绿色版

    Internet Wander 飓风浏览器 3.70下载介绍:  能卓越的多窗口支持浏览器,操作方式、使用界面及习惯完全兼容最新版本的IE ,无限制浏览
    发表于 06-10 10:46 0次下载

    myie浏览器下载(最新版)

    MyIE是GreenBrowser的精简版.MyIE 是一个多窗口浏览器它基于IE并且提供了更多的特色功能:收集、鼠标手势
    发表于 09-20 13:55 0次下载

    Web浏览器,Web浏览器是什么意思

    Web浏览器,Web浏览器是什么意思 看起来给Web浏览器下定义似乎有点荒谬,因为它像电视或收音机一样为大家所熟悉。互联网用户通过使
    发表于 03-22 11:01 2.1w次阅读

    视频监控系统浏览器插件的研究与实现

    针对目前视频监控系统的浏览器插件与非IE内核的浏览器不兼容的问题,本文采用基于FireBreath开发框架开发浏览器插件系统的方法,使浏览器
    发表于 12-18 16:03 5次下载

    liebao浏览器

    浏览器
    发表于 03-20 08:00 0次下载

    浅析如何在项目浏览器窗口管理FPGA应用

    本文将讲述如何通过项目浏览器窗口管理FPGA应用的组件,包括FPGA VI和主VI、FPGA终端、终端范围的选项(例如,FPGA I/O、FPGA FIFO和FPGA终端时钟)。下列示意图显示了由
    发表于 11-18 01:44 775次阅读
    浅析如何在项目<b class='flag-5'>浏览器</b><b class='flag-5'>窗口</b>管理FPGA应用

    什么是区块链浏览器又能做什么

    通常数字资产用户会使用区块链浏览器查询记录在区块中的交易信息。但是,每一条区块链都有自己的区块链浏览器,用户不能通过区块链浏览器进行链查询。例如比特币区块链的
    发表于 10-31 11:08 8753次阅读

    Chromium版Edge浏览器出现窗口突然变黑

    据Softpedia的报道,最近Microsoft Edge中出现的一个问题会导致所有浏览器窗口突然变黑,从而无法继续访问网页。
    的头像 发表于 03-06 14:30 4459次阅读

    为什么选择火狐浏览器呢?

    用户使用360浏览器,时常都会弹出广告窗口,只有在广告微小的位置找到设置功能,此后点击近期不弹出广告时,广告才会被禁止,但在一段时间之后自动弹出,而使用火狐浏览器时,则没有这种恼人的广告。
    的头像 发表于 09-14 16:17 4941次阅读

    谷歌Chrome浏览器已实现iPadOS多窗口功能

    Google Chrome for iPad 的一个全新更新,让用户可以并排打开多个浏览器窗口,这一久违的功能让该平板电脑用户可以同时浏览两个网页。
    的头像 发表于 11-20 15:35 2609次阅读

    IE浏览器正式退役,由Edge浏览器来接任它的工作

    昨天,全球最著名的IE浏览器正式退出了历史舞台。 1995年8月16日,IE浏览器首次亮相在大家的视野中,其简洁的界面迅速吸引了大批用户的注意,在当时,IE浏览器就是大家公认最好用的浏览器
    的头像 发表于 06-16 16:42 3760次阅读

    如何解决问题

    如何解决问题?首先我们需要知道什么是指的是浏览
    的头像 发表于 10-09 16:07 1233次阅读
    如何解决<b class='flag-5'>跨</b><b class='flag-5'>域</b>问题