点击劫持防护加了X-Frame-Options为啥还是被嵌套?

Newb.艳玲 阅读 28

我在项目里加了 X-Frame-Options: DENY 响应头,但测试时发现页面还是能被别人用 iframe 嵌套,UI 被覆盖做点击劫持。是我配置错了吗?

后端是用 Express 写的,代码大概这样:

app.use((req, res, next) => {
  res.setHeader('X-Frame-Options', 'DENY');
  next();
});

但攻击者页面这样嵌我:

<iframe src="https://my-site.com/login" style="opacity:0.1;width:100%;height:500px"></iframe>
<button style="position:absolute;top:200px;left:100px">点我领红包</button>

用户以为点的是红包,其实点了我登录页的按钮……这防护咋没生效啊?

我来解答 赞 1 收藏
二维码
手机扫码查看
1 条解答
Des.丽君
首先检查你的代码逻辑,这段中间件写得没问题,理论上应该生效。但有两个地方需要注意。

一是在某些情况下,如果服务器前面有反向代理或CDN,可能需要在这些层面上也配置X-Frame-Options,而不是只依赖后端处理。

另外一种可能是浏览器缓存问题。我建议你在响应头里同时加上Cache-Control: no-store来强制浏览器不缓存这个设置。

再就是考虑升级到使用Content Security Policy (CSP),它比X-Frame-Options更强大。可以这样加:

app.use((req, res, next) => {
res.setHeader('Content-Security-Policy', "frame-ancestors 'none'");
res.setHeader('X-Frame-Options', 'DENY');
res.setHeader('Cache-Control', 'no-store');
next();
});


最后提醒一句,安全防护不能完全依赖某个单一机制,要多管齐下。这种UI欺骗还是要从页面设计上做些防备才行。
点赞
2026-03-26 14:30