背景与价值Trusted Types将危险DOM写入收敛为受控类型与策略。结合CSP强制,可阻断大多数XSS注入路径。统一规范CSP强制:开启 `require-trusted-types-for 'script'` 与 `trusted-types` 白名单。Policy最小化:统一注册少量策略并限制转换范围。Sink封装:对 `innerHTML`、`insertAdjacentHTML` 等封装受控写入。核心实现CSP头与Policy注册type Res = { setHeader: (k: string, v: string) => void }
function setCsp(res: Res) {
res.setHeader('Content-Security-Policy', "require-trusted-types-for 'script'; trusted-types app-policy")
}
function registerPolicy() {
const tt = (window as any).trustedTypes
if (!tt?.createPolicy) return null
return tt.createPolicy('app-policy', {
createHTML: (s: string) => s,
createScriptURL: (u: string) => u
})
}
受控Sink封装function setHTML(el: Element, html: string, policy: any) {
if (!policy) return
const safe = policy.createHTML(html)
;(el as any).innerHTML = safe
}
function setScriptUrl(el: HTMLScriptElement, url: string, policy: any) {
if (!policy) return
const safe = policy.createScriptURL(url)
el.src = safe as any
}
落地建议在响应头启用Trusted Types严格模式并注册统一Policy,限制转换能力。对核心Sink统一封装调用,避免直接字符串写入。验证清单是否启用 `require-trusted-types-for 'script'` 与白名单策略;DOM写入是否通过受控Policy。

发表评论 取消回复