← 中文资源

简体中文版本

用 Trusted Types 防止 DOM XSS

启用 Trusted Types,把危险写入点统一走一个会做净化的策略,使字符串赋值无法注入脚本。

阅读英文原文

概述

当用户数据在某处进入 innerHTML,即使 CSP 尚可,存储型值仍会作为脚本执行。Trusted Types 让危险写入点拒绝普通字符串,只接受由受控策略产出的可信值,从而把注入面收敛到一处。

关键步骤

  1. 下发要求脚本 Trusted Types 的响应头。
  2. 创建默认策略,在返回可信 HTML 前做净化或转义。
  3. 用策略产出替换直接的 innerHTML 赋值。
  4. 用已知注入载荷验证其被中和。

验证

  • 危险写入点拒绝普通字符串。
  • 注入载荷被渲染为惰性内容。
  • 代码库不再绕过策略。
  • 合法动态 HTML 仍可正常插入。

注意事项

  • 并非所有浏览器都强制 Trusted Types,它属于纵深防御而非普适保证。
  • 若默认策略返回未净化 HTML,会在虚假安全感之下重新引入漏洞。

适用范围

本条目围绕「用 Trusted Types 防止 DOM XSS」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。

// header
Content-Security-Policy: require-trusted-types-for 'script'
// policy
const policy = trustedTypes.createPolicy('default', {
  createHTML: (s) => DOMPurify.sanitize(s),
});
el.innerHTML = policy.createHTML(userInput);