如何使用同步器令牌模式来防止 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.html
。 fakebank.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 令牌吗?