0Pricing
HTML Academy · 课时

iframe 安全:点击劫持与 X-Frame-Options

使用 X-Frame-Options 和 CSP 防止点击劫持攻击

iframe 安全:点击劫持与 X-Frame-Options 是 CoddyKit 上的免费 HTML Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 HTML Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 HTML Academy 课程共包含 4 节课。

什么是点击劫持

点击劫持(用户界面重绘)会将目标网站嵌入诱饵页面上方的透明内嵌框架中。用户以为自己点击的是诱饵内容,实际上点击的是下方隐藏的、已完成身份验证的页面,从而在不知情的情况下执行目标网站上的操作。

点击劫持的攻击机制

攻击者会将 victim.com 加载到一个透明的内嵌框架中,并将其定位在“点击赢大奖!”按钮上方。当用户点击时,实际上点击的是 victim.com 的“删除账户”按钮,并且会以本人在 victim.com 会话 Cookie 中的身份完成身份验证。整个过程不需要钓鱼。

X-Frame-Options 标头

X-Frame-Options: DENY 会阻止页面在任何内嵌框架中加载。X-Frame-Options: SAMEORIGIN 只允许同源页面将其嵌入内嵌框架。请在服务器端为所有已完成身份验证的页面设置此标头,以防止点击劫持。

内容安全策略的 frame-ancestors

Content-Security-Policy: frame-ancestors 'none' 是对 X-Frame-Options: DENY 现代且更灵活的替代方案。frame-ancestors 'self' 可替代 SAMEORIGIN。frame-ancestors 还可以允许特定的受信任源:frame-ancestors https://trusted.example.com。

JavaScript 破框

旧式破框机制使用 JavaScript 跳出框架。这类机制很容易被 sandbox 属性击败,因为该属性会阻止破框脚本运行。请始终使用服务器端标头(X-Frame-Options 或 CSP frame-ancestors),不要依赖不可靠的 JavaScript 破框机制。

何时允许框架嵌入

允许框架嵌入的合理场景包括:在自己的源上嵌入自己的内容(SAMEORIGIN),以及允许特定合作伙伴嵌入您的小组件(使用带有特定源的 frame-ancestors)。请设计策略来允许这些场景,同时拒绝其他所有场景。

组合方案

请同时设置 X-Frame-Options(用于较旧的浏览器)和 CSP frame-ancestors(用于现代浏览器),以实现最大范围的覆盖。当两者同时存在时,在支持 CSP 的浏览器中,frame-ancestors 优先。发送两者可以确保所有用户代理都受到点击劫持防护。

同源内嵌框架的风险

即使是同源内嵌框架也可能带来风险:如果嵌入页面存在存储型 XSS,那么在同源的情况下,它可以通过 parent.document 访问父级页面。对于不需要访问父级页面的同源内嵌框架,请使用不带 allow-same-origin 的 sandbox,以限制嵌入内容漏洞造成的损害。

测试您的防护

请验证点击劫持防护:使用浏览器的网络选项卡,检查响应标头中是否包含 X-Frame-Options 或 CSP frame-ancestors。securityheaders.com 等工具可以分析标头。请创建一个带有内嵌框架、指向您网站的测试 HTML 页面,并确认该页面加载失败。

第三方嵌入内容

嵌入第三方内容(YouTube、Google 地图)时,您就是负责框架嵌入的一方,因此请确保被嵌入的服务允许根据其自身的 X-Frame-Options 策略进行框架嵌入。您无法嵌入禁止框架嵌入的网站——这是有意设计的,用于保护该服务的用户。

元标签中的 CSP frame-ancestors

与大多数 CSP 指令不同,frame-ancestors 不能通过 HTTP-equiv 元标签设置,而必须作为 HTTP 响应标头发送。这样可以确保攻击者无法在浏览器读取元标签之前,通过篡改嵌入的 HTML 来移除防护。

知识检查

为什么 JavaScript 破框代码不是可靠的点击劫持防御措施?

总结

点击劫持会将已完成身份验证的页面嵌入透明内嵌框架,以劫持用户的点击。防御措施是使用服务器端的 X-Frame-Options: DENY 或 CSP frame-ancestors: none 标头。请同时设置两者,以覆盖不同浏览器。JavaScript 破框机制不可靠,请始终使用 HTTP 标头。frame-ancestors 能够细粒度地允许受信任的源,而 X-Frame-Options 无法做到这一点。

常见问题解答

「iframe 安全:点击劫持与 X-Frame-Options」课时是免费的吗?

是的 — 「iframe 安全:点击劫持与 X-Frame-Options」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 HTML Academy 课程的其余内容,请升级到 CoddyKit PRO。 HTML Academy 课程共包含 4 节课。

「iframe 安全:点击劫持与 X-Frame-Options」这节课中我会学到什么?

使用 X-Frame-Options 和 CSP 防止点击劫持攻击 你通过在浏览器中直接运行的动手代码来练习 HTML Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 HTML Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 HTML Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「iframe 安全:点击劫持与 X-Frame-Options」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 HTML Academy 课中编写并运行代码吗?

能。每节 HTML Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. iframe 元素:src 与 sandbox
  2. iframe 安全:点击劫持与 X-Frame-Options
  3. embed 和 object 元素
  4. iframe 延迟加载
← 返回 HTML Academy