Trusted Types、postMessage 与浏览器信任边界

Trusted Types、postMessage 与浏览器信任边界

这篇笔记还在编辑中,内容可能会继续补充、调整或重写。

从数据流识别危险边界

前端安全不仅是转义服务端模板。URL、DOM 属性、跨窗口消息、第三方脚本、本地存储和 JSON 合并都可能把不可信数据送入高权限 API。排查时应追踪来源、转换、危险 Sink 和浏览器执行上下文。

Trusted Types

Trusted Types 可以配合 CSP 限制把普通字符串传给 innerHTML 等 DOM XSS Sink,迫使应用通过受控 Policy 创建可信值。它是减少 DOM 注入面的方法,不会自动判断业务数据安全,也不能替代上下文编码和安全 DOM API。

落地时先使用 Report-Only 收集违规,清理直接 DOM 注入,再逐步启用:

Content-Security-Policy-Report-Only:
  require-trusted-types-for 'script'; trusted-types app-html

Policy 应集中、数量少且经过评审。一个直接返回输入的万能 Policy 只会绕过保护。

postMessage

发送消息时指定精确 targetOrigin,接收时同时校验 event.origin、必要时校验 event.source,并对消息结构执行运行时验证。来源可信不代表消息内容永远可信,另一个窗口可能存在 XSS 或版本不兼容。

不要把 Token、个人数据或具有副作用的任意命令协议广播给 *

iframe 与第三方内容

使用 sandbox 只开放必要能力,结合 CSP frame-ancestors 控制谁能嵌入当前页面。第三方 iframe、脚本和微前端需要明确存储、导航、弹窗、下载和跨源通信权限。

DOM Clobbering 与原型污染

攻击者控制的 HTML 可能通过元素 idname 影响全局属性解析;不安全的深度合并可能写入 __proto__ 等特殊键。应避免依赖隐式全局变量,对外部对象执行 Schema 校验,并使用维护良好的合并实现。

实践任务

  1. 盘点应用中的 HTML 字符串 Sink,并用 Trusted Types Report-Only 收集调用点。
  2. 为 iframe 通信定义带版本和类型的消息协议。
  3. 分别伪造错误 origin、错误 source 和错误 Schema 的消息,确认全部拒绝。
  4. 对第三方 iframe 逐项收紧 sandbox 权限。

验收标准

  • DOM 注入 Sink 有明确来源和安全 Policy
  • postMessage 不使用无边界的 * 处理敏感通信
  • 所有跨窗口消息执行来源和运行时 Schema 校验
  • iframe 权限遵循最小化原则
  • 外部对象不会未经校验进入深度合并或配置系统

参考资料