CSRF 和 iframe

Posted

技术标签:

【中文标题】CSRF 和 iframe【英文标题】:CSRF and iframes 【发布时间】:2016-11-12 10:59:05 【问题描述】:

在防止 CSRF 攻击时,我应该采取以下步骤:

    用户登录,设置会话cookie并生成CSRF令牌 用户提交表单(带有令牌),它应该与会话中的令牌匹配

但是当攻击者使用 iframe 时,它​​也会发送会话 cookie,生成相同的 CSRF 令牌,iframe 中的表单也将包含该令牌。这样攻击者就可以访问了。

我在这里错过了什么?

【问题讨论】:

How to prevent my site page to be loaded via 3rd party site frame of iFrame的可能重复 【参考方案1】:

您错过了这样一个事实,即 IFrame 在同源策略下无法完全访问 Window 对象,除非它们的来源匹配。 Details here:

javascript API,例如 iframe.contentWindow、window.parent、 window.open 和 window.opener 允许文档直接引用 彼此。当两个文档的来源不同时,这些 引用提供对 Window 和 Location 对象的非常有限的访问

因此,攻击者的框架将无法读取window.document,也无法读取任何包含表单中的 CSRF 字段。

不过,您确实需要担心 Clickjacking。这是您的网站在 IFrame 中加载但随后变为透明的地方,并且用户被引诱点击攻击者页面上的某些内容(例如“赢得 iPad 点击此处”),这实际上导致点击实际上发生在敏感页面上在您的页面中发挥作用。

建议使用X-Frame-Options: DENY 和内容安全政策frame-ancestors 指令来防止您的网站被框架化。

【讨论】:

但是如果 iFrame 中被攻击的表单是空的并且攻击者无法访问它来使用 JavaScript 填充它,那么点击劫持如何发挥作用? 这里主要有两个场景。 1) 如果表单仅包含按钮。 2) 任何存在的表单都可以使用查询字符串或 POST 提供的表单值进行预填充。在此阶段可能没有任何 CSRF 检查,因为填写表单不被视为更改状态的操作。

以上是关于CSRF 和 iframe的主要内容,如果未能解决你的问题,请参考以下文章

selenium处理iframe和动作链

Django学习之禁用csrf和使用csrf操作详解

CSRF 和 X-CSRF-Token 的区别

CSRF理解和实战

CORS和CSRF修炼宝典

CSRF攻击和防护