2014-05-05 69 views
4

在我的一个控制器中,我编写了以下内容来保护CSRF的某些页面。Rails 4在哪里存储用于CSRF保护的身份验证令牌?

protect_from_forgery :only => [:foo, :bar] 

当我加载URL的对应于foobar,我查看HTML,我没有看到任何隐藏的输入域或包含任何安全令牌的meta标签,描述here

但是,在测试过程中,我确实注意到CSRF对这些页面无效,虽然它对于同一应用程序中未受保护的其他页面有效。

那么Rails 4在哪里存储用于验证请求来自原始页面的安全令牌?

请注意,我已经通过Ruby On Rails Security Guide读,并且从部分上protect_from_forgery,它说

这会自动包含在由导轨产生的各种形式和Ajax请求 安全令牌。如果安全令牌与预期的 不匹配,会话将被重置。

的问题是,这安全令牌似乎是从上启用了CSRF保护页面的形式丢失,即使CSRF的确不是对他们有效。


注意,这个代码是从class project,其中的目标之一是进行点击劫持攻击绕过CSRF项目。我在这里问的问题是正交于作业的目的。

我只是很好奇Rails如何做CSRF。

在直接做了rails server之后,我找不到安全令牌的相关URL是http://localhost:3000/protected_transfer

回答

9

CSRF令牌存储在用户的会话中(默认情况下,它位于Rails中; Rails 4中的加密cookie)。它还作为<meta>标记(供JavaScript库使用)通过csrf_meta_tags帮助程序方法写入页面,以及页面中由form_tagform_for生成的任何表单中的隐藏字段。

看看这个项目,CSRF令牌没有出现的原因是HTML是用一个字面值<form>标签写的,而不是form_for帮助器,它将包括CSRF令牌。此外,csrf_meta_tags助手不在布局中,这就是元标记没有被写入的原因。

该表格被硬编码发布到<form action="post_transfer" method="post">不应受CSRF保护保护,因此该表格应该是CSRF-able,即使该视图标记为protect_from_forgeryprotected_post_transfer方法甚至不可能接受合法的请求,因为真实性令牌从不发送。

我怀疑教师错过了这个,因为测试将使用合法的形式(击中未经验证的端点,并让它成功),然后指示学生尝试对受保护的端点进行CSRF(这将会不管怎么说都不会通过召集),所以你最终会测试两种不同的事情,这些事情会以错误的理由产生正确的结果。

+0

感谢您实际查看项目代码。令人惊讶的是,它*确实接受了合法的请求,现在我正在摸索着理解为什么。 – merlin2011

+0

它发布到'post_transfer'(表单动作是硬编码的)而不是'protected_post_transfer',所以它实际上应该容易受到CSRF的攻击。你确定它不是? –

+0

非常好的赶上!它看起来像教练搞砸了。我会将它指向'protected_post_transfer'并查看它是否仍然接受任何请求。 – merlin2011

相关问题