postmessage 安全跨域通信需坚持双向校验、明确目标、数据隔离:父页须等 iframe 加载完并用精确 targetorigin 发送结构化消息;子页须严格验证 event.origin、解析 event.data 类型,并在视频场景中确保 readystate 和用户手势;三条铁律缺一不可。

用 postMessage 安全实现跨域 iframe 通信,核心在于“双向校验 + 明确目标 + 数据隔离”。它不是绕过同源策略,而是通过浏览器内置机制,在可控前提下建立信任通道。
父页面:精准发送,不裸奔
发送前必须等 iframe 加载完成,且 targetOrigin 必须写死为子页面的确切协议+域名+端口(如 "https://video.example.com"),绝不能用 "*"。消息体建议用结构化对象,例如:
{ type: "play", id: "v123" }{ type: "setVolume", value: 0.75 }
避免传原始字符串或未序列化的复杂对象;若需兼容老浏览器,统一用 JSON.stringify() 编码后再发。
子页面:严格验源,只接可信消息
子页面监听 message 事件后,第一件事是比对 event.origin —— 必须完全匹配父页面的来源(如 "https://main-site.com"),否则直接 return。接着解析 event.data,只响应已知 type 类型,忽略非法字段。可选地,用 event.source.postMessage() 回传确认或状态,同样要指定 event.origin 作为目标源。
视频类场景的特别处理
HTML5 视频在跨域 iframe 中无法被父页直接调用 play(),必须靠子页内部操作。注意两个关键点:
- 播放指令发出前,确保
video.readyState >= 4(HAVE_ENOUGH_DATA),或监听canplay事件后再执行,否则会静默失败 - 移动端(iOS/Android)要求首次播放必须由用户手势触发,因此父页发
play命令前,应确保子页已有一次合法点击/触摸上下文
安全底线:三条铁律
不验证 origin 就处理消息 = 开门揖盗;不指定 targetOrigin 就发数据 = 广播敏感信息;不检查 data 结构就执行逻辑 = 执行任意命令。这三条缺一不可。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











