如何使用同步器令牌模式来防止 CSRF 安全?

Posted

技术标签:

【中文标题】如何使用同步器令牌模式来防止 CSRF 安全?【英文标题】:How is using Synchronizer Token Pattern to prevent CSRF safe? 【发布时间】:2013-04-09 14:33:05 【问题描述】:

我一直在阅读有关使用同步器令牌模式来防止 CSRF(CSRF 表示跨站点请求伪造。)的信息,但我不明白它实际上是如何安全的。

假设我有一个带有两个网址的假银行网站 fakebank.com:

fakebank.com/withdrawForm.html - 显示提款表单的 GET 请求 fakebank.com/doWithdraw - 发布到这个 url 以进行提现

我对安全漏洞的理解是maliciousSite.com可以欺骗fakebank.com/doWithdraw的POST请求,如果你当前登录fakebank,POST就会成功。

假设我们实现了一个同步器令牌模式,它将在fakebank.com/withdrawForm.html 上嵌入一个密码。 maliciousSite.com 不能仅仅欺骗该表单的 GET 请求,解析 html 结果,获取令牌,然后使用该令牌创建 POST 请求吗?

这是假设 fakebank.com 没有检查 HTTP Referrer 或 Origin 或 maliciousSite.com 成功欺骗了 Referrer/Origin 是 fakebank.com。

【问题讨论】:

github.com/JudeNiroshan/CSRF_Synchronizer_Token_Pattern 【参考方案1】:

之所以安全,maliciousSite.com 不能简单地做一个GET,窃取令牌,然后做一个POST,是因为请求是由用户的浏览器完成的,而不是由位于@ 的服务器完成987654324@。从fakebank.com 返回的所有数据返回到用户的浏览器,而不是返回到maliciousSite.com 的服务器。如果maliciousSite.com 确实执行了 GET 来检索令牌,则它将是与颁发给用户不同的令牌。由于同域限制,maliciousSite.com 无法将此 cookie 设置到用户浏览器中以提交给fakebank.com

CSRF POST 攻击通过欺骗用户浏览器直接使用格式正确的 POST 请求来请求 fakebank.com/withdrawForm.htmlfakebank.com 的服务器愉快地执行请求的POST,从而使用POST 正文中提供的参数转移资金(其中包括由maliciousSite.com 放置的属于攻击者的目标帐户)。 maliciousSite.com 的服务器不需要查看返回的数据,因为已经采取了行动(除非 fakebank.com 使用这些 CSRF 令牌,maliciousSite.com 不可能知道,除非它以某种方式泄露.它不能要求它)。如果fakebank.com 正在使用CSRF 令牌,那么maliciousSite.com 将提交缺少令牌的POST 请求,从而表明潜在的CSRF 攻击正在进行中。

此方法的漏洞包括使用未充分保密并以某种方式泄露的 CSRF 令牌。此外,如果 CSRF 令牌不够随机,那么maliciousSite.com 可能能够猜到它。此外,如果浏览器在执行相同域策略时存在弱点,则可能会被利用。一般来说,现代浏览器不易受此影响。

如果这是一个不充分的解释,请告诉我,我会尝试为你更好地表达它。

【讨论】:

如果您能够将 javascript 注入用户的浏览器以发起攻击,有什么能阻止您简单地嵌入一些 jquery 来执行 GET 请求、解析它,然后在其中执行 POST相同的<script> 标签? @SLC 如果您可以将脚本代码注入用户的浏览器,那么您就不再是在谈论 CSRF 而是在谈论 XSS。到那时,CSRF 令牌不仅一文不值,而且是您最不关心的问题。 具体来说,你不能只做一个 jquery GET 请求的原因。凭据 XHR(js 发起)请求是否会被受害者浏览器阻止,除非明确的 CORS 标头设置为允许来自恶意网站的请求并允许凭据。甚至通配符也会被阻止。例如。确保您的网站永远不会返回:Access-Control-Allow-Origin:malwaresite.com(许多在线 CORS 教程都有非常糟糕的做法,您将允许传入的 Origin 标头)和 Access-Control-Allow-Credentials:true。跨度> 【参考方案2】:

这正是重点。浏览器中的Same Origin Policy 不允许GET 请求到其他站点。因此,任何站点都无法仅在浏览器中使用 Javascipt 从另一个站点获取 CSRF 令牌。

【讨论】:

以上是关于如何使用同步器令牌模式来防止 CSRF 安全?的主要内容,如果未能解决你的问题,请参考以下文章

可以使用(加密强)会话 cookie 作为 CSRF 令牌吗?

将 REST 服务的 CSRF 令牌作为 Http 响应标头包含在内是不是安全?

PHP 在反 CSRF 令牌上的进一步安全性

关于 CSRF 的问题

前端安全系列之二:如何防止CSRF攻击?

在基于 AJAX 的应用程序中使用令牌防止 CSRF