trusted types 是浏览器强制执行的 js 运行时机制,需 http 响应头 csp + js 策略定义 + sink 封装三者协同生效;html 中 meta 标签或 script 无法启用或绕过。

Trusted Types 不是 HTML 层面能“做”的东西,它是一套由浏览器强制执行的 JS 运行时机制,必须通过 Content-Security-Policy 响应头 + JavaScript 策略定义协同生效。单独在 HTML 文件里写任何标签、属性或注释,都无法启用或绕过 Trusted Types。
为什么直接在 HTML 里加 script 或 meta 标签没用
常见误解是:在 里插入 <meta http-equiv="Content-Security-Policy" content="..."> 就能开启 Trusted Types——但该语法在绝大多数浏览器中被忽略(仅部分旧版 Firefox 支持,且不支持 trusted-types 指令)。实际生效必须依赖 HTTP 响应头。
- HTML 中的
metaCSP 只支持有限指令(如default-src),trusted-types和require-trusted-types-for必须由服务器返回 - 即使你把策略 JS 脚本放在
<script></script>标签里,若 CSP 头未提前下发,trustedTypes.createPolicy()调用会静默失败或抛出TypeError: trustedTypes is undefined -
<script type="module"></script>或内联脚本无法规避拦截:只要后续执行了el.innerHTML = unsafeStr,仍会触发Failed to set the 'innerHTML' property... This document requires 'TrustedHTML'
真正起效的三要素缺一不可
Trusted Types 是“策略定义 + 策略引用 + sink 拦截”三位一体的机制,任意一环缺失都会导致防护失效。
-
HTTP 响应头必须包含:
Content-Security-Policy: trusted-types securePolicy; require-trusted-types-for 'script';(securePolicy是你 JS 中定义的策略名) -
JS 策略必须在 DOM 加载前执行:推荐放在
最顶部的<script></script>中,且不能是异步/延迟加载 -
所有 sink 调用必须使用封装值:比如
el.setHTML(policy.createHTML(raw)),而非el.innerHTML = raw;location.href = policy.createURL(url),而非直接赋值字符串
容易被忽略的 DOM sink 场景
很多团队只改 innerHTML,却漏掉其他同样被拦截的 API,导致上线后功能异常但查不出原因。
-
insertAdjacentHTML、document.write、DOMParser.parseFromString(html, 'text/html')同样要求传入TrustedHTML -
location.assign()、location.replace()、<a href="javascript:..."></a>中的 javascript: URL 需要policy.createScriptURL() -
setTimeout('alert(1)', 100)字符串形式调用会被拦截,必须改用函数引用:setTimeout(() => alert(1), 100) - 第三方库如
marked、DOMPurify返回的字符串仍是普通字符串,需显式包装:policy.createHTML(DOMPurify.sanitize(dirty, {RETURN_TRUSTED_TYPE: false}))不行,必须设为true并确认其返回值类型兼容
Monaco Editor 等组件的特殊处理
像 Monaco 这类深度操作 DOM 的库,即使你全局启用了 Trusted Types,它内部的渲染逻辑仍可能触发拦截——除非它显式适配。
- Monaco 从 v0.34+ 支持
trustedTypesPolicy: true配置项,但该选项仅启用其内部校验,并不自动帮你包装传入内容 - 你传给
monaco.editor.create()的value若含 HTML 片段(如富文本预览模式),仍需先经策略处理:editor.setValue(policy.createHTML(userInput)) - 自定义语言高亮、hover provider 等扩展点若动态插入 HTML,也必须走同一策略链,不能假设“编辑器内部会处理”
最常被卡住的点不是“怎么写策略”,而是策略名和 CSP 头里的 trusted-types 值不一致,或策略创建时机晚于首个 innerHTML 调用——这两个错误不会报明确异常,只会让 Trusted Types 彻底静默失效。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











