Ruby on rails Rails 4在哪里存储用于CSRF保护的身份验证令牌?

Ruby on rails Rails 4在哪里存储用于CSRF保护的身份验证令牌?,ruby-on-rails,security,csrf,csrf-protection,Ruby On Rails,Security,Csrf,Csrf Protection,在我的一个控制器中,我编写以下代码来保护某些页面不受CSRF的影响 protect_from_forgery :only => [:foo, :bar] 当我加载对应于foo和bar的URL并查看HTML时,我没有看到任何隐藏的输入字段或包含任何安全令牌的元标记,如前所述 然而,在测试期间,我确实观察到CSRF对这些页面无效,尽管它对同一应用程序中未受保护的其他页面有效 那么rails4在哪里存储用于验证请求是否来自原始页面的安全令牌呢 请注意,我已经通读了,并且在防止伪造的部分中,

在我的一个控制器中,我编写以下代码来保护某些页面不受CSRF的影响

  protect_from_forgery :only => [:foo, :bar]
当我加载对应于
foo
bar
的URL并查看HTML时,我没有看到任何隐藏的输入字段或包含任何安全令牌的元标记,如前所述

然而,在测试期间,我确实观察到
CSRF
对这些页面无效,尽管它对同一应用程序中未受保护的其他页面有效

那么
rails4
在哪里存储用于验证请求是否来自原始页面的安全令牌呢

请注意,我已经通读了,并且在
防止伪造的部分中,它说

这将自动在所有表单和Ajax中包含一个安全令牌 由Rails生成的请求。如果安全令牌与什么不匹配 如预期,将重置会话

问题在于,启用CSRF保护的页面上的表单中似乎缺少此安全令牌,即使CSRF确实对其无效


注意,此代码来自一个,其中一个目标是执行点击劫持攻击以绕过CSRF项目。我在这里问的问题与作业的目的是正交的

我只是好奇Rails到底是如何实现CSRF的


直接在中执行
rails服务器
之后,我找不到安全令牌的相关URL是
http://localhost:3000/protected_transfer

CSRF令牌存储在用户的会话中(默认情况下,在Rails中是cookie;在Rails 4中是加密cookie)。它通过
csrf\u meta\u tags
helper方法以
标记(供Javascript库使用)的形式另外写入页面,并以页面中
form\u tag
form\u for
生成的任何形式的隐藏字段写入

看看这个项目,CSRF标记没有出现的原因是HTML是用一个literal
标记编写的,而不是包含CSRF标记的
帮助器的
表单。此外,布局中不存在
csrf\u meta\u标记
helper,这就是meta标记无法写入的原因

该表单已硬编码为投递到
,不应受到CSRF保护,因此该表单应可进行CSRF,即使视图标记为
防止伪造
protected\u post\u transfer
方法甚至不可能接受合法请求,因为真实性令牌从未发送


我怀疑讲师没有注意到这一点,因为测试将合法使用表格(命中未验证的端点,并让其成功),然后指示学生尝试针对受保护的端点进行CSRF(无论如何都不会通过集合),因此,您最终测试了两种不同的东西,它们由于错误的原因产生了正确的结果。

感谢您查看项目代码。令人惊讶的是,它确实接受合法的请求,现在我挠头想弄明白为什么。它是发布到
post\u transfer
(表单操作是硬编码的),而不是
protected\u post\u transfer
,因此它实际上应该容易受到CSRF的攻击。你确定不是吗?抓得很好!看起来教练把事情搞砸了。我将把它指向
protected\u post\u transfer
,看看它是否仍然接受任何请求。这就是为什么
form\u For
和Rails路径助手很好的原因-它们为您管理所有这些东西,所以不会出现这些bug!你完全正确。当点击
protected\u post\u transfer
时,此代码不接受合法请求。这回答了问题,尽管不是我所期望的那样。