非常好的问题 👍
这是 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。
发表回复