最有效方式是通过nginx的add_header指令精准声明各类静态资源可信源,禁用unsafe-inline/unsafe-eval,显式配置script-src、style-src、font-src、img-src、connect-src等指令,并启用report-uri/report-to上报机制,且必须使用http响应头而非meta标签。

直接在 Nginx 中用 add_header 配置 CSP,是防止静态资源劫持最有效、最可控的方式。关键不是“全放开”,而是精准声明哪些源可信,让浏览器拒绝加载任何未授权的 JS、CSS、字体、图片等资源。
明确限制各类静态资源的加载源
静态资源劫持常发生在 CDN 被污染、第三方库被篡改、或内联代码被注入时。必须为每类资源单独指定可信来源,不能只依赖 default-src 'self':
-
script-src:只允许可信域名的 JS,禁用
'unsafe-inline'和'unsafe-eval';若需内联脚本,改用nonce-xxx或sha256-xxx哈希校验 - style-src:同理限制 CSS 来源,避免恶意样式注入(如覆盖登录框、窃取焦点);若使用 UI 框架的动态样式(如 Ant Design 的运行时主题),需显式添加对应 CDN 域名
-
font-src:限定字体仅来自
'self'或fonts.gstatic.com等已知安全源,防止通过字体文件执行隐蔽 payload -
img-src:允许
'self'和data:(小图标),禁止通配符*;避免攻击者通过图片 URL 注入 tracker 或触发 XSS 变种 -
connect-src:虽不属“静态资源”,但影响资源加载行为(如 font loading 时的 CORS 请求),应限定为 API 域名或
'self'
禁用高风险回退与默认行为
很多配置失效,是因为没切断“兜底路径”:
- 去掉
default-src 'self'后仍被绕过?检查是否遗漏了font-src或style-src——它们不会自动继承default-src,必须显式声明 - 避免使用
*或https:这类宽泛源;https:允许任意 HTTPS 域名,等于开放劫持入口 - 显式设置
object-src 'none'、base-uri 'self'、form-action 'self',堵住非资源类劫持通道
用 report-uri / report-to 主动发现劫持尝试
即使策略写得严,也可能漏掉某个动态加载的字体或异步 chunk。加上报告机制,能第一时间捕获异常请求:
- 在 Nginx 配置中加入
report-uri /csp-report(旧版)或report-to csp-endpoint(新版) - 后端部署简易接收端(如 Express 路由
POST /csp-report),记录violated-directive和blocked-uri - 重点关注
blocked-uri指向未知域名或 data: 协议的记录——这往往是劫持试探痕迹
生产环境必须用 HTTP 头,禁用 meta 标签
<meta http-equiv="Content-Security-Policy"> 在以下场景完全失效:
- 页面被 iframe 嵌入时,meta 不生效(只有响应头起作用)
- 服务端渲染(SSR)或模板引擎(如 Thymeleaf)中,meta 标签可能被动态覆盖或忽略
- 某些浏览器对 meta 中的 CSP 支持不完整(如不支持
report-to)
务必通过 Nginx、Spring Boot Filter 或其他服务端方式注入响应头,确保策略从首次响应即生效。










