如何使用Synchronizer Token Pattern来防止CSRF安全?

时间:2013-04-17 01:05:07

标签: javascript security web csrf

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

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

  • fakebank.com/withdrawForm.html - 显示提款单
  • 的GET请求
  • fakebank.com/doWithdraw - 发送到此网址进行撤销

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

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

假设fakebank.com未检查HTTP Referrer或Origin或maliciousSite.com成功欺骗推荐人/来源是fakebank.com。

2 个答案:

答案 0 :(得分:22)

这是安全的原因,maliciousSite.com不能简单地执行GET,窃取令牌,然后执行POST是请求由用户的浏览器完成,而不是maliciousSite.com的服务器。从fakebank.com返回的所有数据都将返回给用户的浏览器,而不是maliciousSite.com的服务器。如果maliciousSite.com执行GET以检索令牌,则它将是与发布给用户的令牌不同的令牌。由于相同的域限制,maliciousSite.com无法将此Cookie设置为用户的浏览器以提交给fakebank.com

CSRF POST攻击的工作原理是欺骗用户的浏览器直接使用正确形成的fakebank.com/withdrawForm.html请求POSTfakebank.com处的服务器愉快地执行请求的POST,从而使用POST正文中提供的参数(包括属于maliciousSite.com所在的攻击者的目标帐户转移资金。 1}})。 maliciousSite.com处的服务器不需要查看返回的数据,因为已采取操作(除非fakebank.com使用这些CSRF令牌,maliciousSite.com除非它{...}}已经在某种程度上被泄露了。它不能要求它。如果fakebank.com正在使用CSRF令牌,则maliciousSite.com将提交缺少令牌的POST请求,从而表明正在进行的潜在CSRF攻击。

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

如果这是一个不充分的解释,请告诉我,我会尝试为你说清楚一点。

答案 1 :(得分:3)

这就是重点。浏览器中的Same Origin Policy不允许 GET 请求到其他网站。因此,没有站点可以在浏览器中使用Javascipt从另一个站点获取CSRF令牌。