前端安全之CSP内容安全策略配置指南
什么是CSP(Content Security Policy)?如何通过HTTP Header或meta标签配置CSP?请给出一个针对React/Vue SPA应用的CSP配置示例,以及如何排查CSP违规问题。
回答
小字辈
CSP(内容安全策略)
CSP是一种白名单机制,告诉浏览器哪些来源的资源是可信任的。不匹配的资源将被阻止加载/执行。
配置方式
1. HTTP Header(推荐)
Content-Security-Policy: default-src 'self'; script-src 'self';
2. meta标签
<meta http-equiv="Content-Security-Policy" content="default-src 'self';">
核心指令
| 指令 | 控制范围 |
|---|---|
| default-src | 所有资源类型的默认策略 |
| script-src | 脚本 |
| style-src | 样式表 |
| img-src | 图片 |
| connect-src | fetch/XMLHttpRequest/WebSocket |
| font-src | 字体文件 |
| frame-src | iframe |
| object-src | // |
| base-uri | 标签 |
| report-uri | 违规报告URL |
SPA应用CSP配置示例
Content-Security-Policy:
default-src 'self';
script-src 'self' 'nonce-{random}' https://www.googletagmanager.com;
style-src 'self' 'unsafe-inline';
img-src 'self' data: https://*.alicdn.com;
connect-src 'self' https://api.example.com wss://ws.example.com;
font-src 'self' https://fonts.gstatic.com;
frame-src 'self' https://www.google.com;
object-src 'none';
base-uri 'self';
form-action 'self';
report-uri /csp-report;
关键说明:
'self':仅允许同源'nonce-{random}':只执行含特定nonce属性的script标签(Vite/Webpack支持自动注入)'unsafe-inline':允许内联脚本(降低安全性,SPA中常需要)'unsafe-eval':允许eval等(尽量避免)report-uri:违规时上报给API
排查CSP违规
- 浏览器Console:CSP违规会在控制台输出详细的错误信息(资源URL、违反的指令)
Refused to load the script '...' because it violates the following Content Security Policy directive: "script-src 'self'". - report-uri/report-to:自动接收违规报告(JSON格式)
{ "csp-report": { "document-uri": "https://example.com/", "blocked-uri": "https://evil.com/script.js", "violated-directive": "script-src 'self'" } } - 先用 Report-Only 模式测试:
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report- 阻止不执行,只收集违规报告
- 确认无误后切换为
Content-Security-Policy