nginx 统一配置 csp 是防范 xss 最有效方式,需禁用后端重复输出、显式覆盖所有响应(含错误页/静态资源)、先 report-only 观察再收紧、用 nonce/hash 替代 unsafe-inline,并对 api/上传/高敏路径差异化加固。

直接在 Nginx 层配置 CSP 是防范脚本类数据注入(尤其是 XSS)最有效、最可控的方式。它不依赖后端语言或框架,而是由浏览器强制执行白名单规则,从源头阻止恶意代码加载与运行。
必须统一由 Nginx 管理,禁用后端重复输出
CSP 头只能由 Nginx 一家输出,否则策略会失效或被覆盖:
- 在
http或server块顶层使用add_header,确保作用范围覆盖全部响应路径 - 检查 PHP、Node.js、Java 等所有后端服务,移除手动设置
Content-Security-Policy的代码(包括框架默认行为) - 错误页(404/500)、重定向(301/302)、静态资源(.js/.css/.svg)默认不继承 CSP —— 必须加
always参数,并在对应location块中显式补上
先 Report-Only,再逐步收紧策略
上线严格策略前,务必用报告模式观察真实流量,避免功能崩溃:
- 配置
Content-Security-Policy-Report-Only,并指定report-uri或report-to - 持续收集 3–7 天日志,重点关注哪些内联脚本、CDN 域名、
eval调用是业务必需的 - 根据报告结果分步收紧:先去掉
'unsafe-eval',再处理'unsafe-inline'(改用 nonce 或 hash)
禁用 unsafe-inline,用 nonce 实现可控内联
生产环境必须移除 'unsafe-inline',但又不能简单禁止所有内联脚本 —— 此时需前后端协同使用 nonce:
- Nginx 本身无法生成动态值,需后端在渲染 HTML 时为每个请求生成唯一 base64 nonce(如
nonce="Xa9fLm2p"),并注入到<script nonce="Xa9fLm2p"></script> - Nginx 配置中同步写入该值:
add_header Content-Security-Policy "script-src 'self' 'nonce-Xa9fLm2p' https://cdn.example.com"; - 不能硬编码 nonce,也不能复用;若无法改造后端,可用 hash(对内联脚本内容做 sha256 后填入)替代
对 API 和敏感路径做差异化加固
非 HTML 页面无需执行脚本,可大幅降低攻击面:
- 在
location /api/块中单独配置:add_header Content-Security-Policy "default-src 'none'; script-src 'none'; connect-src 'self' https:;"; - 上传目录(如
/uploads/)可设为default-src 'none'并启用sandbox - 登录页、支付页等高敏路径,可额外限制
frame-ancestors 'none'防点击劫持











