好的 👍 我来给你整理一份 更详细的 CSP 须知清单,涵盖从基础概念、常见指令到部署与排坑。你可以把它当作 CSP 使用手册 来理解和实践。
CSP 详细须知
一、CSP 的工作原理
浏览器在加载页面时,会根据响应头或 <meta> 中的 Content-Security-Policy 规则来判断:
-
哪些资源(JS、CSS、图片、字体等)允许加载
-
哪些脚本可以执行
-
哪些内联脚本被禁止
-
是否允许混合内容(HTTPS 页面下引入 HTTP 资源)
-
是否允许
<iframe>、<object>等嵌入
如果有违规行为:
-
严格模式:直接拦截并报错。
-
Report-Only 模式:不拦截,只上报给你配置的 URL。
二、常见 CSP 指令(重点)
-
资源加载控制
-
default-src:默认资源加载策略(如果其他指令没写,走这个)。 -
script-src:控制 JS 的来源,支持nonce-、sha256-校验。 -
style-src:控制 CSS 来源,避免外部样式注入。 -
img-src:控制图片来源。 -
font-src:控制字体来源。 -
media-src:控制音频、视频来源。 -
frame-src:控制嵌入的 iframe 来源。
-
-
脚本执行控制
-
'unsafe-inline':允许内联 JS(不推荐)。 -
'unsafe-eval':允许eval()、new Function()(危险)。 -
nonce-xxxx:动态标记允许执行的内联脚本。 -
sha256-xxxx:允许指定哈希的脚本。
-
-
其他安全相关
-
connect-src:控制 Ajax / WebSocket / Fetch 的请求地址。 -
form-action:限制<form>的提交目标。 -
frame-ancestors:限制页面是否能被嵌入到别的 iframe(防止点击劫持)。 -
upgrade-insecure-requests:自动把 HTTP 资源升级为 HTTPS。 -
block-all-mixed-content:禁止 HTTPS 页面加载 HTTP 资源。
-
-
违规上报
-
report-uri https://example.com/csp-report -
report-to csp-endpoint(CSP3 推荐方式)
-
三、配置建议(最佳实践)
-
最小权限原则
-
default-src 'self'; -
其他资源按需单独开放,例如:
script-src 'self' https://cdn.jsdelivr.net; style-src 'self' https://fonts.googleapis.com; font-src https://fonts.gstatic.com; img-src 'self' data:; connect-src 'self' https://api.example.com;
-
-
避免危险关键字
-
不要随意用
'unsafe-inline'和'unsafe-eval'。 -
如果必须使用内联脚本,优先用
nonce或sha256。
-
-
调试与上线流程
-
阶段 1:启用
Content-Security-Policy-Report-Only,收集日志,不拦截。 -
阶段 2:逐步清理违规项,完善白名单。
-
阶段 3:切换为
Content-Security-Policy,正式拦截。
-
-
日志监控
-
收集 CSP 报告并存储,分析第三方库是否违规。
-
建议接入日志服务(如 ELK、Sentry)进行报警。
-
四、常见坑点
-
第三方 SDK/广告脚本
- 常常加载自有域名下的子资源,要仔细配置。
-
内联脚本
- 如果前端框架(Vue/React)生成内联代码,需要用
nonce或hash。
- 如果前端框架(Vue/React)生成内联代码,需要用
-
旧代码迁移
- 如果项目里有大量
eval、innerHTML动态执行代码,开启 CSP 会很痛苦,需要逐步重构。
- 如果项目里有大量
-
混合内容
- CSP 开启后,HTTP 资源会被阻止,旧系统要迁移到 HTTPS。
五、实用模板
一个相对安全的通用配置:
Content-Security-Policy:
default-src 'self';
script-src 'self' 'nonce-ABC123' https://cdn.jsdelivr.net https://www.googletagmanager.com;
style-src 'self' 'nonce-ABC123' https://fonts.googleapis.com;
img-src 'self' data:;
font-src https://fonts.gstatic.com;
connect-src 'self' https://api.example.com;
frame-ancestors 'none';
upgrade-insecure-requests;
block-all-mixed-content;
report-uri /csp-report;六、最佳时机
-
开发后期 → 上线前:用
Report-Only收集数据。 -
上线初期:逐步收紧策略,保证功能不受影响。
-
稳定运营期:强制执行,并长期监控上报日志。
要不要我帮你写一份 适合典型前后端分离(React/Vue 前端 + Node/PHP 后端)项目的 CSP 白名单配置模板,直接可用?