应优先使用content-security-policy的frame-ancestors指令(如frame-ancestors 'none';),它已取代x-frame-options成为w3c标准,优先级更高、语法更灵活,且必须通过http响应头设置,meta标签和js检测均无效。

你的页面被别人用 iframe 套进去,不是 sandbox 能拦的
很多人在自己页面的 <iframe></iframe> 上加 sandbox,以为这样就能防“被嵌套”——完全搞反了方向。sandbox 是给「你嵌别人」时用的,它约束的是 iframe 里加载的内容;而防止「别人嵌你」,关键是你这个页面必须主动拒绝被加载。浏览器只会在加载你页面的那一刻,检查服务端返回的响应头,决定是否渲染。HTML 里写任何东西都来不及。
X-Frame-Options 和 frame-ancestors 哪个该用
优先用 Content-Security-Policy: frame-ancestors 'none',它是 X-Frame-Options 的现代替代方案,支持更细粒度控制(比如只允许特定域名),且已被所有主流浏览器支持。X-Frame-Options 仅支持 DENY 或 SAMEORIGIN,功能受限,且不能和 CSP 共存时覆盖后者。
-
frame-ancestors 'none':彻底禁止任何站点用 iframe 加载你 -
frame-ancestors 'self':只允许同源页面嵌套(注意单引号不能省) -
frame-ancestors https://trusted.com:白名单模式,可指定多个域名,用空格分隔 - 绝对不要写成
frame-ancestors none(缺单引号)——会被当成关键字解析失败
Nginx / Apache 怎么加响应头才生效
必须通过服务端配置加 HTTP 响应头,<meta http-equiv="Content-Security-Policy"> 在这里完全无效,浏览器加载前就已决策完毕。
- Nginx:在 server 或 location 块里加
add_header Content-Security-Policy "frame-ancestors 'none';"; - Apache:在 .htaccess 或虚拟主机配置中加
Header set Content-Security-Policy "frame-ancestors 'none';" - 如果已有其他 CSP 规则(如 script-src),要把
frame-ancestors合并进去,用分号分隔,不要重复声明Content-Security-Policy头
前端 JS 检测 window.top 只能当备选
用 if (window !== window.top) { window.top.location = '/'; } 这类跳转逻辑,确实能在部分场景下打断嵌套,但它有硬伤:
- 依赖 JS 执行,若攻击者禁用 JS 或注入恶意脚本早于你的检测逻辑,就失效
- 用户看到的是闪屏或跳转中断,体验差,且可能被绕过(比如先加载再移除 body)
- 无法阻止初始渲染,敏感 DOM 或资源可能已被抓取或监听
- 仅作为服务端防护失效时的兜底,绝不能单独依赖
真正可靠的防线只有一条:服务端响应头必须存在且正确。其它都是补位,不是防线本身。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











