主题
Next.js 高级架构
Next.js 如何实现 CSP、nonce 和第三方脚本治理?
CSP 不是加一行 Header 就结束,还要解决 nonce 的请求级生成、脚本加载策略、缓存和违规回报。
面试官想考什么
- 为什么 nonce 不能写死? 考察请求级安全。
- 动态 nonce 对静态缓存有什么影响? 考察安全与性能取舍。
- 第三方分析脚本如何接入? 考察供应链治理。
- CSP 报错如何收集和修复? 考察闭环能力。
一句话回答
text
Nonce 应按请求随机生成并同时用于 CSP Header 和需要执行的内联脚本,不能写死或放到客户端生成;策略要覆盖 Next.js/RSC、第三方脚本和缓存影响,并通过 report-only、违规上报和白名单治理逐步收紧。面试回答详解
1. CSP 目标
限制脚本来源、对象来源、图片、连接、frame 和 worker,降低 XSS 后的执行与数据外传风险。CSP 是纵深防御,不替代输出转义、依赖审计和权限控制。
2. Nonce 链路
text
request -> generate cryptographic nonce
-> CSP header -> render approved inline scripts with nonce
-> browser enforces same request policynonce 必须不可预测、每次请求不同,并且只授予必要脚本。客户端生成 nonce 无法保护服务端输出。
3. 缓存影响
请求级 nonce 会使响应更难作为公共静态内容缓存。公开内容可以考虑 hash/static CSP 或拆分动态与静态响应;个性化页面不应为了 CDN 命中牺牲 nonce 和数据安全。
4. 第三方脚本
每个域名都要有业务 owner、用途、数据范围和下线机制。使用 next/script 选择合理加载时机,限制 connect-src、img-src 和 frame-src;不要因为某个 SDK 要求 unsafe-eval 就全站放开。
5. 发布和观测
先使用 Content-Security-Policy-Report-Only 收集违规,再逐条修复、灰度和切换 enforce。报告接口脱敏、限流,区分真实攻击、浏览器扩展和误配置。记录 release、route 和 script source,支持快速禁用第三方脚本。
可直接背诵的 30 秒回答
text
CSP 的重点是建立可执行资源白名单和违规闭环。动态页面按请求生成不可预测 nonce,并同时写入 Header 和受控内联脚本,不能写死或由浏览器生成。第三方脚本按用途、域名和权限治理,先 report-only 再 enforce,同时评估 nonce 对静态缓存的影响,并准备 SDK 下线开关。扩展知识
nonce 与 hash
- Nonce:适合动态生成的内联脚本,按请求变化。
- Hash:适合内容稳定、可在构建时确定的内联脚本。
- 外部来源白名单:只能限制来源,不能证明第三方脚本本身可信。
面试官追问链
追问一:用了 CSP 就没有 XSS 了吗?
- 考察点:防护边界。
- 回答方向:不是。CSP 是降低影响的纵深防御,仍需安全渲染、依赖治理、服务端校验和权限隔离。
追问二:为什么不直接加 unsafe-inline?
- 考察点:策略质量。
- 回答方向:它会扩大注入后的执行面;优先 nonce/hash,确有兼容性约束时也要限定范围并评估风险。
追问三:CSP 违规突然增多怎么处理?
- 考察点:运维响应。
- 回答方向:按 release/source/route 分类,判断攻击、扩展或发布误配,必要时回滚策略或关闭新增脚本,同时保留证据。