不校验event.origin等于开放控制权;仅字符串包含匹配不安全,必须全等比较并配合白名单、event.source双重验证,且需结构化校验event.data。

不校验 event.origin 就接收并执行消息,等于把控制权交给任意网站——这不是隐患,是已知漏洞。
为什么只比对 event.origin 字符串还不够安全
浏览器确实会强制填充 event.origin,但它只是个字符串,攻击者无法篡改值本身,却可以构造一个同源的恶意 iframe(比如 https://evil-shop.example.com)嵌入你的页面。如果你只写 if (event.origin.includes('example.com')),它就能绕过。
真正有效的做法是全等匹配 + 白名单兜底:
- 必须用
===比较,不能用indexOf、includes或正则模糊匹配 - 生产环境建议维护一个白名单数组,如
['https://shop.example.com', 'https://admin.example.com'],再用whitelist.includes(event.origin) - 开发时若用
http://localhost:3000,上线前必须替换成真实域名;http://127.0.0.1:3000和它不是同一源 -
file://协议下event.origin是"null",需单独处理,不能直接===字符串
event.source 不是可选动作,而是关键验证环节
event.source 是指向实际发送窗口的引用,无法被伪造。但仅靠它也不够:如果父页同时打开了多个子窗口,event.source 可能是你没预期的那个。
所以验证链必须是“先 origin,再 source”:
- 先确认
event.origin在白名单内 - 再检查
event.source是否等于你保存过的合法引用(比如iframe.contentWindow或window.open()返回值) - 如果用的是动态创建的 iframe,务必在
load后立刻缓存contentWindow,避免后续重定向导致引用失效 - 不要在 handler 里直接赋值
event.source = null或做其他干扰操作,可能破坏引用一致性
targetOrigin 写错会导致消息静默丢弃,且无任何提示
从 Chrome 128+ 和 Firefox 125+ 开始,跨域场景下若 targetOrigin 是 "*",消息会被浏览器直接丢弃,不报错、不警告、不触发回调——你看到“发了没回”,八成卡在这儿。
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
必须写死完整地址:
- 协议、域名、端口三者缺一不可:
"https://widget.example.com:8080" -
http://localhost和http://localhost:8080是不同源,后者端口不能省略 - CDN 地址如
https://d34gxw3jqlasaag.cloudfront.net也必须显式指定,不能靠自动推断 - 如果目标支持多子域,不要在发送端用通配,而应在接收端做
origin白名单匹配
结构校验不是锦上添花,而是防崩溃刚需
哪怕 event.origin 和 event.source 都对得上,event.data 仍可能被恶意构造为 null、undefined、字符串或循环引用对象——这些都会让后续 event.data.type 报错。
每次进入 message handler,前三行建议固定为:
if (event.origin !== 'https://trusted.com') return;<br>if (!event.source || event.source !== expectedWindow) return;<br>if (typeof event.data !== 'object' || !event.data.type) return;
更进一步,对每个 type 做字段约束:
-
type: 'seek'→ 要求event.data.time是 number 且 ≥ 0 -
type: 'volume'→ 要求event.data.value是 number 且在 0–1 之间 - 遇到未知
type,直接console.warn并return,别尝试 fallback
最容易被忽略的一点:所有校验必须放在 handler 最开头,且不能被 try/catch 包裹——否则错误静默吞掉,调试时连日志都看不到。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










