← 中文资源

简体中文版本

用 nonce 加固内容安全策略

去掉 unsafe-inline,为合法脚本生成每响应 nonce,并收集违规报告,使 CSP 真正拦截注入脚本。

阅读英文原文

概述

带 unsafe-inline 的 CSP 等于形同虚设,任何注入脚本照常执行。以每响应 nonce 只放行可控脚本,先用只报告模式观察违规,修复后再强制,可兼顾安全与不破坏站点。

关键步骤

  1. 为每个响应生成随机 nonce,并加到可控的 script 标签上。
  2. 制定不含 unsafe-inline、要求 nonce 的策略。
  3. 配置 report-uri 或 report-to 收集违规。
  4. 先只报告、修复违规后再强制。

验证

  • 注入的内联脚本被拦截。
  • 合法脚本正常执行。
  • 违规报告可被收集。
  • 强制模式下站点功能正常。

注意事项

  • 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'`);