是的,frame-src指令必须显式配置,否则iframe默认被拦截;它不继承default-src,仅配script-src等无效,Tauri中需在tauri.conf.json的csp下以字符串形式声明,如"frame-src": "'self' https://trusted.com"。

frame-src 指令必须显式配置,否则 iframe 默认被拦
浏览器对 iframe 的加载控制完全依赖 frame-src 指令;不写它,哪怕 default-src 'self' 也拦不住——因为 frame-src 不继承 default-src。只配 script-src 或 connect-src 对 iframe 完全无效。
常见错误现象:页面里写了 <iframe src="https://example.com"></iframe>,控制台报 Refused to frame 'https://example.com/' because it violates the following Content Security Policy directive: "frame-src 'self'",但开发者以为“我写了 'self' 就够了”,其实漏掉了指令本身。
-
frame-src 'self':只允许同源 iframe(含file://协议下无效) -
frame-src 'self' https://trusted.com:允许多个明确域名,注意必须带协议(https://),不能只写trusted.com -
frame-src 'none':彻底禁用所有 iframe,适合纯单页应用或高敏感后台 - 若同时用
frame-ancestors(防点击劫持),两者互不影响,需分别配
Tauri 中的 frame-src 配置不是 HTTP 头,而是 JSON 格式
Tauri 的 CSP 配置走的是应用级 JSON 配置文件(如 tauri.conf.json),不是 HTTP 响应头。直接往响应头里加 Content-Security-Policy: frame-src ... 在 Tauri 里会被忽略。
实操建议:
立即学习“前端免费学习笔记(深入)”;
- 在
tauri.conf.json的app.security.csp下写:"frame-src": "'self' https://embed.example.com" - 值必须是字符串,不是数组;多个源用空格分隔,不是逗号
- Tauri 1.5+ 支持
frame-src,但不支持report-to或nonce用于 iframe,所以第三方嵌入必须靠域名白名单 - 如果 iframe 页面本身也有 CSP,它的策略会叠加生效,不是覆盖——两边都得过
iframe 加载失败时,CSP violation 日志里不提示缺 frame-src
当 iframe 白屏或显示 “Refused to display” 时,DevTools 控制台只报一条泛泛的 Content Security Policy violation,不会像 script-src 那样明确说 “blocked by frame-src”。这是最容易误判的点。
排查步骤:
- 打开 Chrome DevTools → Network → 找到 HTML 请求 → Response Headers → 确认有
content-security-policy字段 - 复制整条策略粘贴到 Google CSP Evaluator,它会标出缺失的
frame-src - 临时切到
Content-Security-Policy-Report-Only模式 +report-uri,看上报日志里violated-directive字段是否为"frame-src" - 注意:本地
file://协议下 CSP 全面失效,调试务必用http-server或vite preview
第三方 iframe 内容可能绕过你的 CSP,尤其带 sandbox 属性时
即使你配了 frame-src https://widget.com,对方 iframe 页面如果自己开了 unsafe-inline 或用了 eval(),照样能执行 XSS——你的 CSP 只管“谁可以嵌入”,不管“被嵌入页面里写了啥”。
更隐蔽的风险点:
-
sandbox属性若没关掉allow-scripts,iframe 里 JS 仍可运行,且不受父页面 CSP 约束 -
allow="clipboard-read; clipboard-write"这类权限声明,可能被恶意 iframe 利用读取剪贴板 - 如果对方域名支持
document.domain设置,跨 iframe DOM 访问可能绕过同源限制 - 真正安全的做法:只嵌入你完全可控或经安全审计的第三方 iframe,别信“他们说他们安全”
frame-src 往往是最晚被补上的指令,因为它不像脚本那样立刻导致白屏——而是静默失败或部分功能不可用。上线前必须逐个验证每个 iframe 的 src 域名是否落在策略内,不能只测主站首页。



















