点击劫持是把透明的 iframe 叠放在正规页面之上,诱导用户做出并非本意的点击的攻击手法。用户以为自己点的是眼前看到的按钮,实际上却被迫点下了背后那个透明 iframe 里的另一个按钮 (确认购买、授予权限等) 。
作为具体的攻击场景,有对社交网络「点赞」按钮的滥用。攻击者先制作一个内容诱人的页面 (例如「免费送礼」) ,再在其上叠加一个含有 Facebook「点赞」按钮的透明 iframe。当用户点击「领取礼物」按钮时,实际被按下的是 Facebook 的「点赞」,攻击者的页面因此得以扩散。
针对点击劫持的对策主要有 2 个。第一,用 X-Frame-Options HTTP 响应头禁止自己网站的页面被嵌入 iframe,可以设置为 DENY (完全禁止) 或 SAMEORIGIN (仅允许同源) 。第二,用 CSP (Content Security Policy) 的 frame-ancestors 指令,可以更灵活地控制嵌入方。CSP 比 X-Frame-Options 是更新的规范,具有可以指定多个源的优点。
在短链接服务中,预览页面和管理后台存在被嵌入 iframe、成为点击劫持目标的风险。对所有页面设置 X-Frame-Options: DENY,原则上禁止被嵌入 iframe,才是安全的做法。