X-Frame-Options 设置后为什么页面还是能被嵌入 iframe?
我在项目里加了 X-Frame-Options: DENY 响应头,但发现别人还是能用 iframe 把我的 React 页面嵌进去,完全没生效。是我配置错了吗?
后端是用 Nginx 配的 header,前端代码大概是这样:
function App() {
return (
<div className="app">
<h1>我的安全页面</h1>
<p>不应该被嵌入 iframe</p>
</div>
);
}
export default App;
本地测试时用另一个 HTML 文件直接写 iframe src 指向这个页面,居然能正常显示……这不就绕过防护了吗?
如果没看到这个header,说明Nginx没配对。正确配置应该是这样(别用add_header,容易踩坑):
如果还是不行,可能是被其他中间件覆盖了。还有个更现代的方案,直接用Content-Security-Policy:
两个方案选一个就行,CSP更强大些。配完记得reload nginx服务。
如果确定是走 Nginx 代理,配置语法得注意别写错位置。要在 server 块或者具体的 location 块里加,而且建议加上
always参数,这样即使 Nginx 返回 4xx 或 5xx 错误,安全头也会带上,防止被钻空子。给你个标准的 Nginx 配置参考,通常是这么写的:
另外,X-Frame-Options 已经算是比较老的防御手段了,虽然现在浏览器还支持,但为了防止注入攻击以及应对未来可能的废弃,更推荐用 CSP (Content Security Policy) 的 frame-ancestors 指令。它能更细粒度地控制谁可以嵌套你的页面。建议把 CSP 也加上,做个双重保险。
配置改完记得执行
nginx -s reload重载配置,并且一定要硬刷新浏览器(Ctrl+F5)把缓存清干净。安全配置这东西,宁可信其无,不可信其有,一定要自己抓包验证响应头确实存在了才行。