https 下配置 csp 的核心是将 add_header content-security-policy "... " always; 置于启用 ssl 的 server { listen 443 ssl; ... } 块顶层,起点为 default-src 'none',配合 report-only 模式灰度上线,并协同 hsts、x-content-type-options 等安全头形成防护闭环。

HTTPS 环境下配置内容加载安全策略,核心是通过 Nginx 设置严格且适配业务的 Content-Security-Policy(CSP)响应头,防止 XSS、恶意资源注入、第三方脚本劫持等风险。仅靠 HTTPS 加密传输无法阻止页面执行非法脚本,CSP 才是真正控制“哪些内容能加载、哪些脚本可执行”的关键防线。
把 CSP 放在 HTTPS server 块里,加 always 参数
CSP 必须写在启用 SSL 的 server { listen 443 ssl; ... } 块内,不能放在全局 http{} 或 HTTP 的 80 端口块中。否则可能误作用于非加密站点,或被浏览器忽略。
- 必须使用
always参数:add_header Content-Security-Policy "... " always;,确保 301/404/500 等所有状态码都携带该头,避免策略在错误页中断 - 不要嵌套在
location块里——除非你明确需要差异化策略;否则统一放在server块顶层(SSL 配置下方、location外),避免被覆盖
从 default-src 'none' 起步,按需放开资源类型
宽松的 CSP(如 default-src *)等于没设。推荐起点是禁止一切,再逐类显式授权:
-
default-src 'none':默认拒绝所有资源加载 -
script-src 'self':只允许同源 JS;若含内联脚本(如 Vue 模板、统计代码),需加'unsafe-inline'并配合nonce或哈希校验(更安全) -
style-src 'self' 'unsafe-inline':多数前端框架依赖内联样式,暂允;生产环境建议提取为外部 CSS -
img-src 'self' data::支持同源图 + base64 图标 -
font-src 'self':如引入 Google Fonts,需补fonts.gstatic.com -
connect-src 'self' https://api.example.com:明确声明 AJAX、fetch、WebSocket 目标
上线前先用 Report-Only 模式观察
直接启用拦截模式容易导致白屏。建议分两步走:
- 第一阶段:用
Content-Security-Policy-Report-Only替换正式头,搭配report-uri /csp-report收集违规日志(Nginx 需配对应location /csp-report接收 POST) - 观察 7–14 天,检查浏览器 Console 和后端日志,确认所有合法资源都被覆盖
- 第二阶段:将
-Report-Only改为正式头,并移除report-uri(或保留用于持续监控)
配合其他安全头形成防护闭环
CSP 不是孤岛,需与基础安全头协同生效:
-
Strict-Transport-Security "max-age=31536000; includeSubDomains":强制全站 HTTPS,子域也生效(启用前确保所有子域已配好证书) -
X-Content-Type-Options "nosniff":防止浏览器 MIME 嗅探绕过 CSP -
X-Frame-Options "DENY":阻断点击劫持,避免页面被嵌入恶意 iframe -
Referrer-Policy "strict-origin-when-cross-origin":控制 Referer 泄露,保护来源路径隐私











