Trusted Types 不能彻底杜绝 DOM XSS,但能从浏览器内核层面强制拦截绝大多数未经策略处理的危险操作,前提是 CSP 配置正确、策略覆盖完整且不绕过校验。

Trusted Types 不能“彻底杜绝”DOM XSS,但它能从浏览器内核层面强制拦截绝大多数未经策略处理的危险操作——前提是 CSP 配置正确、策略覆盖完整、且不绕过可信类型校验。
require-trusted-types-for 'script' 是生效前提
只调用 window.TrustedTypes.createPolicy() 不起作用。必须配合 HTTP 响应头中的 require-trusted-types-for 'script' 指令,浏览器才会对以下 API 抛出 TypeError:
-
innerHTML、outerHTML、insertAdjacentHTML -
document.write/document.writeln -
location.href、location.assign(当值为javascript:时) -
eval、setTimeout、setInterval、new Function()
注意:require-trusted-types-for 'style' 和 'all' 目前兼容性较差(Safari 17.4+ 才开始支持 'style'),生产环境建议先锁定 'script'。
trusted-types 指令必须显式声明策略名
trusted-types 指令不是开关,而是白名单。如果写成 trusted-types *,Chrome 允许任意策略名,但 Safari/Firefox 会拒绝加载(2026 年实测);若漏写策略名,比如只配了 trusted-types;,所有策略创建都会失败。
正确写法示例:
Content-Security-Policy: trusted-types htmlPolicy scriptPolicy; require-trusted-types-for 'script';
对应 JS 中必须使用完全匹配的名称:
if (window.TrustedTypes) {
window.TrustedTypes.createPolicy('htmlPolicy', { createHTML: ... });
window.TrustedTypes.createPolicy('scriptPolicy', { createScript: ... });
}
常见错误:策略名拼错、大小写不一致、或在策略未注册前就调用 getPolicyByName —— 此时返回 undefined,后续调用直接报错。
createHTML 不等于 HTML 转义,它需要真正净化
createHTML 回调函数里不能只做简单字符串替换(如 input.replace(/<script>/gi, '')</script>),这会被绕过。它必须返回语义安全的 HTML 片段,否则仍可能触发 XSS。
推荐做法:
- 用
DOMPurify.sanitize(input, { RETURN_TRUSTED_TYPE: true })(需确保 DOMPurify >= 3.0.0) - 避免手写正则清洗,尤其不要信任
textContent替代方案——它不解决src、href等属性注入 - 对 URL 类型内容,必须用
createScriptURL或createURL,且验证协议白名单(仅允许https:、data:等)
典型陷阱:把用户输入直接塞进 <iframe srcdoc="..."></iframe>,即使用了 createHTML,srcdoc 仍需独立策略(createHTML 不覆盖 srcdoc 的校验)。
第三方库和框架的兼容性盲区
React/Vue/Angular 默认不生成 Trusted Type 对象。例如 Vue 的 v-html、React 的 dangerouslySetInnerHTML 会直接传入字符串,触发 CSP 拦截。
解决方案不是禁用这些 API,而是:
- 封装自定义指令/组件,内部调用策略(如 Vue 3 的
app.directive('safe-html', {...})) - 检查库是否提供 Trusted Types 插件(如 Angular v17+ 支持
DomSanitizer.bypassSecurityTrustHtml()返回TrustedHTML) - 避免在 SSR 渲染中混用客户端策略(服务端无
window.TrustedTypes)
最容易被忽略的一点:Webpack/Vite 构建产物中若含动态 eval(如 import() 表达式未静态化)、或 inline script 标签未加 nonce,也会被 require-trusted-types-for 'script' 拦截并中断执行。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










