trusted types 不是 html 层面能实现的机制,必须通过 csp 响应头、js 策略定义(如 createhtml 返回 trustedhtml)和 sink 调用封装三者协同生效,缺一不可。

createHTML 返回的不是 TrustedHTML 实例,而是普通字符串
浏览器内部会自动把 createHTML 返回的字符串包装成 TrustedHTML,你不能、也不该手动构造它。写 new TrustedHTML(html) 会直接抛 TypeError,因为浏览器不暴露这个构造函数。
正确做法是只返回净化后的字符串,让 Trusted Types 自动处理类型封装:
const policy = trustedTypes.createPolicy('htmlPolicy', {
createHTML: html => DOMPurify.sanitize(html, { RETURN_TRUSTED_TYPE: true })
});
-
DOMPurify.sanitize(..., { RETURN_TRUSTED_TYPE: true })必须启用该选项,否则返回的是普通字符串,仍会被拦截 - 若用正则或
replace()做简单转义(如html.replace(/&/g, '&')),无法防<img src="x" onerror="alert(1)">类绕过,且策略名不匹配时整个策略创建失败 - 不要在
createHTML内做运行时模板拼接:`<div>${userInput}</div>`是错的——拼接发生在策略外,恶意内容已注入
策略名必须和 CSP 响应头中的白名单完全一致
如果 HTTP 响应头写了 Content-Security-Policy: trusted-types default; require-trusted-types-for 'script',那 JS 中就必须用 trustedTypes.createPolicy('default', {...})。名字对不上,调用 createPolicy 就会抛 TypeError: Failed to create a Trusted Type policy。
常见疏漏点:
- 开发时用了
'htmlPolicy',但响应头漏写或拼错成trusted-types html-poilcy - 没设
default策略,而某些库或框架(如旧版 Vue 渲染器)会隐式回退到默认策略,导致静默失败 - 策略定义脚本加载晚于 DOM 操作(比如放在
底部或加了defer),innerHTML = raw先执行,报错后策略才注册,来不及兜底
不是所有 innerHTML 赋值都该走 createHTML
纯文本渲染优先用 textContent,完全绕过 Trusted Types 限制和 HTML 解析风险。只有真正需要插入结构化 HTML 时,才走 createHTML 流程。
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
例如这些场景不该用:
-
el.textContent = userInput→ 安全、高效、无需策略 -
el.setAttribute('title', userInput)→ 属于属性赋值,不受 Trusted Types 管控(但需注意 XSS in attribute) -
location.href = url→ 应用policy.createScriptURL(url),不是createHTML
混淆 sink 类型是上线后大面积报错的主因之一——createHTML 只管 HTML 字符串,不管 URL、JS 代码或样式。
DOMPurify 版本和配置必须匹配 RETURN_TRUSTED_TYPE
DOMPurify.sanitize(html, { RETURN_TRUSTED_TYPE: true }) 在 DOMPurify ≥ 3.0 才可用。低于该版本即使传入该选项,也只返回普通字符串,触发 Failed to set the 'innerHTML' property 错误。
验证方式很简单:
console.log(policy.createHTML('<script>alert(1)</script>') instanceof TrustedHTML); // 应为 true
- 若输出
false,大概率是 DOMPurify 版本太低,或没传RETURN_TRUSTED_TYPE: true - 别自己实现白名单过滤逻辑(如只允许
<b></b>、<i></i>)——维护成本高、易绕过,且createHTML不是过滤器,是可信出口闸门 - 第三方富文本组件(如 Quill、Tiptap)若直接操作
innerHTML,需确认其是否已适配 Trusted Types;否则必须封装 wrapper 或降级使用textContent+ Markdown 渲染
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










