Skip to content

postMessage 跨窗口通信

window.postMessage 用于 iframe / 弹窗与父页通信。若 不校验 event.origin 或对字符串 eval / 插入 HTML,可导致 任意站点向页面注入指令窃取回传数据


不安全接收端

js
window.addEventListener('message', (event) => {
  const data = event.data;
  document.getElementById('out').innerHTML = data; // XSS
});

不安全发送敏感数据

js
// 向所有接收者广播(targetOrigin='*')
otherWindow.postMessage({ token: accessToken }, '*');

任何嵌入的中间帧都可能监听。


推荐写法

js
const TRUSTED_ORIGINS = new Set(['https://app.example.com']);

window.addEventListener('message', (event) => {
  if (!TRUSTED_ORIGINS.has(event.origin)) return;

  const data = event.data;
  if (!data || typeof data !== 'object' || data.channel !== 'my-app') return;

  document.getElementById('out').textContent = String(data.payload ?? '');
});

发送端指定精确目标源:

js
iframe.contentWindow.postMessage(
  { channel: 'my-app', payload: 'hello' },
  'https://trusted-child.example'
);

小结

始终:校验 event.origin结构化协议(类型与字段)、不向 * 发敏感数据展示时用文本而非 HTML