如何防止页面中的按钮被Strokejacking攻击?
我在开发一个在线支付页面时,发现按钮区域容易被恶意页面通过透明IFrame覆盖,导致用户误触转账操作。虽然设置了X-Frame-Options: DENY,但测试时发现攻击页面仍然能嵌套我的页面。
我尝试给按钮添加了style="pointer-events: none",但这样会导致正常用户也无法点击按钮。查看攻击页面代码发现他们用了allowtransparency属性,这和我之前了解的防御方法好像不太一样…
现在卡在如何同时满足:1. 允许合法框架嵌套(有些合作方需要) 2. 确保关键按钮区域无法被覆盖点击。有什么更可靠的防御方案吗?
关键点来了:不能只靠服务端头,得前端主动防。
直接用
X-Frame-Options: SAMEORIGIN配合Content-Security-Policy: frame-ancestors 'self'(CSP 更现代,优先用这个),但你说了要允许合作方嵌,那 frame-ancestors 就得加白名单域名。不过最靠谱的方案是:前端拦截非预期来源的 iframe 嵌套 + 关键区域加防层。
先说服务端配置(Nginx 举例):
注意:
frame-ancestors生效时,X-Frame-Options 会被忽略,所以只配 CSP 就行,但为了兼容老浏览器可以俩都加。然后前端加一层防穿透逻辑,直接用 JS 检测是否被嵌套,如果不是预期来源就干掉 iframe 或遮罩关键按钮:
另外,关键按钮区域加一层透明防层也行,但别用 pointer-events: none,而是用
pointer-events: none只对非预期区域生效。比如:然后 JS 里动态控制
.click-guard的 pointer-events:如果检测到被嵌套,就设成auto并拦截点击。最后提醒:别信
allowtransparency这种老属性,它是让 iframe 背景透明用的,和攻击无关,别被带偏了。真要防点击劫持,记住:服务端 CSP 白名单 + 前端运行时检测 + 关键按钮动态防护,三者结合才稳。
frame-ancestors指令代替X-Frame-Options,CSP 的frame-ancestors更灵活,能指定允许嵌套的域名。关键按钮区域加个透明的div盖在上面,攻击者点不到按钮也搞不了事情。差不多就行,记得把
#protective-layer调整到合适的范围,别挡了正常功能。