您的网站能否 被别人嵌入框架?
点击劫持会把您的真实页面藏在另一个网站上的隐形框架里,让访客在不知情的情况下点击您的按钮。粘贴一个 URL,看看其他网站能否把它嵌入框架,以及这是否会让您的访客面临风险。
- X-Frame-Options
- CSP frame-ancestors
这是在我们页面的框架中加载的该 URL,正如攻击者会做的那样。如果您能看到页面,任何网站都能这样做。如果框架显示 "refused to connect"(拒绝连接)之类的错误,说明您的浏览器已将其拦截。
此 URL 使用普通 http,浏览器不会在 https 页面中加载它,因此框架无论如何都是空白的。请以上方的响应头判定结果为准。
修复方法
发送带有 frame-ancestors 的 Content-Security-Policy,并为旧版浏览器加上 X-Frame-Options。在网站前端的 Web 服务器上同时添加这两个头。
nginx
add_header Content-Security-Policy "frame-ancestors 'self'" always;
add_header X-Frame-Options "SAMEORIGIN" always;
Apache
Header always set Content-Security-Policy "frame-ancestors 'self'"
Header always set X-Frame-Options "SAMEORIGIN"
在运行 Odoo?请使用 'self' 而不是 'none':网站编辑器会在同一域名下的框架中显示您自己的页面。CICDoo 部署的每个实例都默认开启这些响应头。
攻击原理
您的页面,别人的点击
隐形框架
攻击者把您的真实页面加载到透明的 iframe 中,并覆盖在诱饵上,比如领奖按钮或视频播放器。
真实的点击
访客已经登录了您的网站。他的点击落在您的页面上:批准付款、更改邮箱或授予访问权限。
一个响应头即可阻止
frame-ancestors 或 X-Frame-Options 会告诉浏览器哪些网站可以把您嵌入框架。没有它,浏览器对任何人都放行。
常见问题
常见问题,一一解答
这个测试检查什么?
我们从自己的服务器请求该 URL,并读取两个响应头:X-Frame-Options 和 Content-Security-Policy 的 frame-ancestors 指令。页面还会在框架中加载该 URL,让您在自己的浏览器中看到结果。
我应该使用哪个响应头?
frame-ancestors 是现代标准,只要存在就优先生效。同时保留 X-Frame-Options 以兼容旧版浏览器。使用 'self' 只允许您自己的域名,或使用 'none' 阻止所有框架。
为什么框架是空白的?
有些网站会阻止嵌入、对陌生访客显示空白页,或使用普通 http,而浏览器拒绝在 https 页面中加载它。响应头的判定结果与您的浏览器无关。
如果网站能被嵌入框架,就一定有漏洞吗?
不一定。点击劫持需要同时满足:页面上有重要操作(如付款或更改设置)、访客已登录,并且浏览器会在其他网站的框架中发送会话 cookie。当前浏览器不会发送未设置 SameSite=None 的 cookie,因此被嵌入的页面通常以未登录状态加载。不过这些响应头仍然值得添加:它们能彻底堵住这个口子,而且安全审计也会检查它们。
ALLOW-FROM 还受支持吗?
不。当前浏览器会忽略 X-Frame-Options ALLOW-FROM。如需允许特定合作伙伴网站,请改为在 frame-ancestors 中列出它们。
你们会保存 URL 吗?
我们只保留用于频率限制的请求记录,不保存 URL 或结果。