Rails应用程序中的CSRF。如何保护

时间:2014-09-17 17:27:31

标签: ruby-on-rails

我是Rails安全的新手,我不明白一件事。存在CSRF漏洞,Rails中有protect_from_forgery方法生成令牌并保护我的应用程序免受来自其他站点的错误查询。这很好,但是这些网站可以从我的网站解析这个令牌,并使用CSRF漏洞。我不明白如何完全保护我的应用程序。提前致谢。

P.S。 Rails 4

2 个答案:

答案 0 :(得分:1)

我假设您实际上使用的是默认提供的CSRF保护。

  

但是这些网站可以从我的网站解析此令牌,并使用CSRF   漏洞。

不,他们不能。这正是这种保护的工作方式。 CSRF令牌在每个会话中都不同,并且试图伪造请求的攻击者无法知道哪个CSRF令牌现在对您有效。或者,更准确地说,什么令牌有效在您做出所需(由攻击者)请求时,因为令牌是随机生成的,因此应该不可预测

然而,这个令牌可能会因为中间人(一个更加困难的)攻击而从受害者的连接中嗅到,这可能反过来通过强制SSL来抵消。

Rails指南有a section on CSRF countermeasures

答案 1 :(得分:0)

每次请求protect_from_forgery都会添加

<head>
  <!- ... ->
  <meta content="authenticity_token" name="csrf-param" />
  <meta content="xoYoj25LyBvoSlKby4cntwJcVbYhQ38P023yGC6Jecc=" name="csrf-token" />
</head>

以及每种形式

<input name="authenticity_token" type="hidden" value="xoYoj25LyBvoSlKby4cntwJcVbYhQ38P023yGC6Jecc=" />

并且还会添加

cookies[:_csrf_token] = "xoYoj25LyBvoSlKby4cntwJcVbYhQ38P023yGC6Jecc="

然后在每个请求上,它将验证cookies[:_csrf_token]是否与查询字符串参数(?authenticity_token=XX)或标题(X-CSRF-Token: XX)相同,您可以看到它{{3 }}

比较完成here

要深入了解其工作原理,请阅读整个文件,所有魔法都会在那里发生。

回到最初的问题,恶意网站可以从您的网页解析令牌,他们所拥有的只是一个随机令牌,与受攻击用户的Cookie中的相同令牌不匹配。