概述
当用户数据在某处进入 innerHTML,即使 CSP 尚可,存储型值仍会作为脚本执行。Trusted Types 让危险写入点拒绝普通字符串,只接受由受控策略产出的可信值,从而把注入面收敛到一处。
关键步骤
- 下发要求脚本 Trusted Types 的响应头。
- 创建默认策略,在返回可信 HTML 前做净化或转义。
- 用策略产出替换直接的 innerHTML 赋值。
- 用已知注入载荷验证其被中和。
验证
- 危险写入点拒绝普通字符串。
- 注入载荷被渲染为惰性内容。
- 代码库不再绕过策略。
- 合法动态 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);