概述
带 unsafe-inline 的 CSP 等于形同虚设,任何注入脚本照常执行。以每响应 nonce 只放行可控脚本,先用只报告模式观察违规,修复后再强制,可兼顾安全与不破坏站点。
关键步骤
- 为每个响应生成随机 nonce,并加到可控的 script 标签上。
- 制定不含 unsafe-inline、要求 nonce 的策略。
- 配置 report-uri 或 report-to 收集违规。
- 先只报告、修复违规后再强制。
验证
- 注入的内联脚本被拦截。
- 合法脚本正常执行。
- 违规报告可被收集。
- 强制模式下站点功能正常。
注意事项
- nonce 需要每响应生成 HTML,静态 HTML 需结合哈希方案。
- 严格 CSP 可能与自行注入脚本的第三方组件冲突。
适用范围
本条目围绕「用 nonce 加固内容安全策略」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。
const nonce = crypto.randomBytes(16).toString('base64');
res.setHeader('Content-Security-Policy',
`default-src 'self'; script-src 'self' 'nonce-${nonce}'; object-src 'none'; base-uri 'none'`);