点击劫持防护加了X-Frame-Options为啥还是被嵌套?
我在项目里加了 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>
用户以为点的是红包,其实点了我登录页的按钮……这防护咋没生效啊?
一是在某些情况下,如果服务器前面有反向代理或CDN,可能需要在这些层面上也配置X-Frame-Options,而不是只依赖后端处理。
另外一种可能是浏览器缓存问题。我建议你在响应头里同时加上Cache-Control: no-store来强制浏览器不缓存这个设置。
再就是考虑升级到使用Content Security Policy (CSP),它比X-Frame-Options更强大。可以这样加:
最后提醒一句,安全防护不能完全依赖某个单一机制,要多管齐下。这种UI欺骗还是要从页面设计上做些防备才行。