<meta http-equiv="X-Frame-Options">完全无效,因浏览器规范从未实现该机制,Chrome 40+、Firefox 50+、Edge 14+均忽略;真正起效的只有服务端HTTP响应头X-Frame-Options或Content-Security-Policy的frame-ancestors指令。

不能靠 HTML 代码真正防止页面被恶意嵌入——X-Frame-Options 和 Content-Security-Policy 的 frame-ancestors 必须由服务端通过 HTTP 响应头发送,<meta> 标签完全无效。
为什么 <meta http-equiv="X-Frame-Options"> 没用
浏览器规范从未实现该机制。Chrome 40+、Firefox 50+、Edge 14+ 全部忽略它。你看到的“生效”,往往是因为开发服务器(如 Vite、Webpack Dev Server)自动注入了响应头,不是 <meta> 起的作用。
常见错误现象:
-
curl -I https://yoursite.com返回头里压根没有X-Frame-Options - 本地能跳转,上线后 iframe 依然能正常加载
- 父页面用
srcdoc或修改document.domain(旧 IE)可轻松绕过
必须用服务端响应头:X-Frame-Options 最简配置
这是兼容性最好的兜底方案,IE8+ 全支持,且不可被 JS 绕过。
立即学习“前端免费学习笔记(深入)”;
- 完全禁止嵌入:
X-Frame-Options: DENY - 仅允许同源嵌入:
X-Frame-Options: SAMEORIGIN -
ALLOW-FROM已废弃,现代浏览器基本不支持
Nginx 示例:add_header X-Frame-Options "DENY" always;
Apache 示例:Header always set X-Frame-Options "DENY"
更推荐用 CSP frame-ancestors 替代
Content-Security-Policy: frame-ancestors 'none'; 是现代标准,优先级高于 X-Frame-Options,且支持多域名白名单。
- 禁止所有:
frame-ancestors 'none' - 只允同源:
frame-ancestors 'self' - 允许多个指定域名:
frame-ancestors https://a.example.com https://b.example.com
注意:若同时设置 X-Frame-Options 和 frame-ancestors,浏览器取更严格者;但旧版 IE 只认前者,所以建议两者共存。
JS 检测只是辅助,别当安全防线
它只能在页面已加载后跳转或隐藏内容,无法阻止嵌入本身,也无法防 sandbox 隔离、srcdoc 或跨域 document.write 等绕过方式。
最小可用检测逻辑(放 <head> 最顶部):
if (window.top !== window.self) {
window.top.location = window.self.location;
}
风险点:
- 父 iframe 启用
sandbox="allow-scripts"时,此脚本可能被阻断 - 攻击者可提前拦截跳转、覆盖
window.top.locationsetter - 对点击劫持类攻击(透明覆盖层)完全无效
真正关键的,是服务端是否发出正确的响应头——其余都是补丁,不是铠甲。



















