背景与价值CSP严格配置可防止脚本注入。nonce/hash与strict-dynamic可在保证可用性的同时实现最小白名单。统一规范生成nonce:每次响应生成唯一nonce并仅允许匹配脚本执行。strict-dynamic:启用后移除外部域白名单,降低被劫持风险。哈希支持:对内联必要脚本使用 `sha256-...` 哈希。核心实现nonce生成与头设置function genNonce(): string { const u = new Uint8Array(16); crypto.getRandomValues(u); let s=''; for (let i=0;i<u.length;i++) s += u[i].toString(16).padStart(2,'0'); return s } type Res = { setHeader: (k: string, v: string) => void } function setCsp(res: Res, nonce: string) { const v = `script-src 'nonce-${nonce}' 'strict-dynamic'; object-src 'none'; base-uri 'self'` res.setHeader('Content-Security-Policy', v) } 哈希占位async function sha256(s: string): Promise<string> { const d = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(s)); const u = new Uint8Array(d); let b=''; for (let i=0;i<u.length;i++) b += u[i].toString(16).padStart(2,'0'); return 'sha256-' + b } 落地建议每次响应生成nonce并在脚本标签声明 `nonce` 属性;启用 `strict-dynamic` 后移除外域白名单。对少量必要内联脚本使用哈希并定期审计。验证清单是否生成并下发唯一nonce;是否启用 `strict-dynamic` 并收敛外部域白名单。

发表评论 取消回复