非常好的问题 👍
这是 Web 安全扫描 / 浏览器安全控制 中一个非常常见的告警项:

“Content-Security-Policy 头缺失或不安全 (Missing or unsafe Content-Security-Policy header)”

下面我会帮你详细解释这是什么意思、为什么危险、以及如何在 Nginx / Apache / Spring Boot / Node.js 等环境中正确修复。


🧩 一、什么是 Content-Security-Policy(CSP)?

Content-Security-Policy (CSP) 是浏览器的一种安全机制,用来防止以下攻击:

  • XSS(跨站脚本攻击)
  • 点击劫持
  • 数据注入
  • 恶意外部资源加载

它通过告诉浏览器:

“我允许从哪里加载脚本、图片、CSS、字体、iframe 等资源。”


⚠️ 二、为什么扫描工具会报“CSP 头缺失或不安全”

当网站响应头中没有以下字段:

Content-Security-Policy: ...

或使用了过于宽松的策略(例如 unsafe-inline*)时,
安全扫描器(如 Qualys、OWASP ZAP、Burp Suite、Nessus)会提示:

❗ 缺少 CSP 头或策略过于宽松,网站可能受到 XSS 攻击。


🧠 三、正确的安全头示例

最基础、安全性较好的 CSP 头:

Content-Security-Policy: default-src 'self';

表示只允许加载与当前网站同源的内容。


🔐 四、常见 CSP 配置模板(按用途)

场景示例策略说明
通用网站(最安全)Content-Security-Policy: default-src 'self'; object-src 'none'; frame-ancestors 'none';禁止外部脚本和 iframe
允许加载 CDN 资源Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.jsdelivr.net https://cdnjs.cloudflare.com; style-src 'self' 'unsafe-inline';允许 JS/CSS 从 CDN 加载
前后端分离项目(API + 前端)Content-Security-Policy: default-src 'self'; connect-src 'self' https://api.example.com; img-src 'self' data:;允许访问后端接口和 base64 图片
调试或老项目(兼容)Content-Security-Policy: default-src 'self' 'unsafe-inline' 'unsafe-eval';兼容旧代码,但安全性较低,不建议生产使用

⚙️ 五、在不同环境中添加 CSP 头

1️⃣ Nginx

在配置文件中添加:

add_header Content-Security-Policy "default-src 'self'; object-src 'none';" always;

放在 server { ... }location / { ... } 块内。


2️⃣ Apache

.htaccess 或配置文件中添加:

Header set Content-Security-Policy "default-src 'self';"


3️⃣ Spring Boot

在 Java 代码中添加过滤器:

@Component
public class SecurityHeaderFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Content-Security-Policy", "default-src 'self'; object-src 'none';");
        chain.doFilter(req, res);
    }
}

或在 Spring Security 配置中:

http
  .headers()
  .contentSecurityPolicy("default-src 'self'");


4️⃣ Node.js (Express)

安装 Helmet 中间件:

npm install helmet

然后在 app.js 中:

const helmet = require("helmet");
app.use(helmet.contentSecurityPolicy({
  directives: {
    defaultSrc: ["'self'"],
    scriptSrc: ["'self'", "https://cdn.jsdelivr.net"],
    objectSrc: ["'none'"]
  }
}));


🧾 六、如何验证 CSP 是否生效

打开浏览器开发者工具 → Network → 选中响应 → Headers → 查看响应头中是否有:

Content-Security-Policy: default-src 'self';

或使用在线工具检测:


💡 七、实战建议

  • 从最简单的规则开始(例如 default-src 'self'),逐步完善。
  • 避免 'unsafe-inline''unsafe-eval',它们会降低安全性。
  • 对旧项目可先设置为 “Report-Only” 模式,观察兼容情况: Content-Security-Policy-Report-Only: default-src 'self';
  • 最后确认无误后再启用正式的 CSP。