在前端 Web 安全体系中,DOM XSS 是最隐蔽、最难根治的攻击类型,传统的手动字符转义、代码审计方案始终无法摆脱依赖开发者自觉的致命缺陷。而基于 CSP(Content Security Policy)Level 3 规范的 Trusted Types,是浏览器原生提供的、从底层彻底阻断 DOM XSS 的工业级标准方案。本文将从原理、配置、核心API、规则、实战到最佳实践,全方位覆盖 Trusted Types 所有核心知识点,成为你落地该安全方案的完整指南。
一、Trusted Types 基础认知
1. 定义与定位
Trusted Types 是 CSP Level 3 的核心安全特性,通过可信类型策略严格管控浏览器所有高危 DOM 操作,强制要求所有动态注入的内容必须经过安全策略处理,从根源杜绝 DOM XSS 攻击。
2. 发展历程
Trusted Types 并非近几个月的新技术:
- 2020 年:Chrome/Edge 83+ 正式稳定支持;
- 2024 年:W3C CSP3 规范定稿,成为 Web 标准;
- 2025-2026 年:Safari 17.4+、Firefox 148+ 全面兼容,实现全浏览器覆盖;
- 近两年:成为前端生产环境 DOM XSS 防御的标配方案。
3. 核心价值
替代不可靠的手动转义,由浏览器强制校验安全规则,即使开发者出现代码失误,也不会产生 XSS 漏洞。
二、必备 CSP 配置
Trusted Types 必须配合 HTTP 响应头 Content-Security-Policy 才能强制生效,核心包含两个指令:
1. 核心指令说明
-
trusted-types定义可信策略白名单,控制允许创建的策略名称; 可选参数:策略名:仅允许创建指定名称的策略;'none':禁止创建任何策略;'allow-duplicates':允许重复创建同名策略(仅容错,不覆盖);*:允许任意唯一策略名。
-
require-trusted-types-for 'script'强制开启可信类型校验,锁死所有高危 DOM API,拒绝直接赋值普通字符串。'script': 强制校验脚本 / HTML 注入 (innerHTML、eval、script、javascript:)'style':强制校验 CSS 样式注入(cssText、style 标签)'all':强制校验全部高危操作'none': 关闭强制校验
2. 标准生产配置
Content-Security-Policy:
trusted-types securePolicy;
require-trusted-types-for 'script';
default-src 'self';
script-src 'self';
三、5 大核心策略方法(全覆盖)
Trusted Types 提供 5 个标准策略方法,对应浏览器所有高危 DOM 操作场景,覆盖全部 DOM XSS 攻击面。每个方法会返回专属的可信类型对象,是唯一能被高危 API 接受的合法值。
| 方法名称 | 对应可信类型 | 高危 DOM 场景 | 核心用途 | 标准实践 |
|---|---|---|---|---|
| createHTML | TrustedHTML | innerHTML/outerHTML/document.write | 防御 HTML 注入攻击 | 转义危险字符,安全渲染用户输入 |
| createScript | TrustedScript | eval/setTimeout/Function/内联脚本 | 防御动态脚本执行 | 99% 业务直接禁用(抛错) |
| createScriptURL | TrustedScriptURL | script src/import/Worker | 防御恶意脚本文件加载 | 禁用或白名单校验域名 |
| createURL | TrustedURL | iframe/img/a/video/link | 防御钓鱼链接、恶意资源嵌入 | 校验资源域名合法性 |
| createStyleSheet | TrustedStyleSheet | style.cssText/style标签 | 防御 CSS 注入攻击 | 直接禁用,杜绝脚本执行风险 |
关键区分:createURL vs createScriptURL
createScriptURL:仅管控 JS 脚本相关地址(执行代码);createURL:管控所有普通资源地址(展示内容)。
四、工业级完整安全策略样例
整合 5 大方法,遵循最小权限原则,仅开放必要能力,禁用所有高危操作:
// 创建全局唯一安全策略
const securePolicy = trustedTypes.createPolicy('securePolicy', {
// 1. 安全处理HTML:转义所有危险字符
createHTML: (input) => {
return input
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
},
// 2. 禁用动态脚本执行
createScript: () => {
throw new Error('禁止执行动态脚本');
},
// 3. 禁用外部脚本地址加载
createScriptURL: () => {
throw new Error('禁止加载未知脚本');
},
// 4. 安全校验普通资源URL
createURL: (url) => {
const allowedDomains = ['your-domain.com', 'cdn.your-domain.com'];
const urlObj = new URL(url, location.origin);
if (allowedDomains.includes(urlObj.hostname)) return url;
throw new Error('不允许的资源地址');
},
// 5. 禁用动态CSS样式
createStyleSheet: () => {
throw new Error('禁止使用动态CSS');
}
});
五、核心规则:同名策略优先级与 allow-duplicates
1. 同名策略默认规则
策略名称全局唯一,不可覆盖、不可修改:
- 首次创建策略:成功;
- 重复创建同名策略:直接抛出
TypeError,代码终止。
2. allow-duplicates 真相(仅容错,非覆盖)
该参数不是用来覆盖策略,而是工程化容错机制:
- 开启后:重复创建同名策略不报错,直接返回第一次创建的策略实例;
- 适用场景:微前端、组件库、SDK 重复加载、开发环境热更新;
- 业务代码:完全不需要添加,保持最小安全配置。
3. 优先级总结
先创建的策略永久生效,后续同名策略一律无效。
六、核心对比:Trusted Types vs 手动 escape
这是开发者最易混淆的点,两者安全等级天差地别:
| 对比维度 | 手动 escape | Trusted Types |
|---|---|---|
| 防护机制 | 字符串替换,依赖开发者调用 | 浏览器强制拦截,无策略直接拒绝执行 |
| 可靠性 | 易遗漏、易写错、人为失误即漏洞 | 浏览器底层保障,零失误 |
| 规则统一 | 多开发者易写多套转义逻辑 | 全局唯一策略,统一管理 |
| 防护范围 | 仅能转义HTML,无法管控脚本 | 覆盖5大类高危场景,全攻击面防御 |
核心结论:手动 escape 是补丁级防护,Trusted Types 是浏览器级终极防护。
七、浏览器兼容与落地最佳实践
1. 兼容版本
- Chrome/Edge:83+(2020年)
- Safari:17.4+(2025年)
- Firefox:148+(2026年)
- 移动端:全平台主流浏览器全覆盖
2. 落地最佳实践
- 业务项目:仅配置必要策略名,不添加
allow-duplicates; - 微前端/组件库:添加
allow-duplicates避免重复加载报错; - 默认禁用:
createScript/createScriptURL/createStyleSheet一律禁用; - 全局唯一:整个项目仅创建一个安全策略,统一管控。
八、总结
Trusted Types 是 CSP 规范为解决 DOM XSS 提供的终极解决方案,它摆脱了传统安全方案对人工的依赖,通过浏览器原生强制校验、可信类型隔离、最小权限管控,实现了 100% 可靠的 DOM XSS 防御。
本文覆盖了 Trusted Types 的配置、5大核心API、同名规则、容错机制、实战代码、对比差异全知识点,是 2026 年全浏览器兼容环境下,前端落地 Trusted Types 的标准参考文档。在现代 Web 开发中,Trusted Types 已不再是可选的安全优化,而是保障业务安全的基础标配。
参考文档
- W3C - Trusted Types: w3c.github.io/trusted-typ…