gpt4 book ai didi

ruby-on-rails - Rails 4在哪里将身份验证 token 存储在CSRF保护中?

转载 作者:行者123 更新时间:2023-12-04 06:20:21 29 4
gpt4 key购买 nike

在我的一个 Controller 内,我编写了以下代码以保护某些页面免受CSRF的影响。

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

当我加载对应于 foobar的URL并查看HTML时,我看不到任何隐藏的输入字段或包含任何安全 token 的meta标签,如 here所述。

但是,在测试过程中,我确实观察到 CSRF对这些页面无效,尽管它对同一应用程序中未 protected 其他页面有效。

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

请注意,我已经阅读了 Ruby On Rails Security Guide,并从 protect_from_forgery的那一部分开始说

This will automatically include a security token in all forms and Ajax requests generated by Rails. If the security token doesn't match what was expected, the session will be reset.



问题是启用CSRF保护的页面上的形式似乎缺少该安全 token ,即使CSRF确实不能有效地抵抗它们。

请注意,此代码来自class project,其目标之一是执行点击劫持攻击以绕过CSRF项目。我在这里提出的问题与分配的目的正交。

我只是对Rails到底如何做CSRF感到好奇。

在直接执行rails server后,我找不到安全性 token 的相关URL是http://localhost:3000/protected_transfer

最佳答案

CSRF token 存储在用户的 session 中(默认情况下,它在cookie中,在Rails中;在加密的cookie中,在Rails 4中)。此外,它还通过<meta>帮助程序方法作为csrf_meta_tags标记(供Javascript库使用)写到页面中,并以form_tagform_for在页面中生成的任何形式写在隐藏字段中。

在此项目中,未出现CSRF token 的原因是HTML是用文字<form>标记而不是form_for辅助程序(包含CSRF token )编写的。此外,布局中不存在csrf_meta_tags帮助器,这就是为什么meta标签不会被写入的原因。

表单被硬编码到<form action="post_transfer" method="post">上,该表单不应该受到CSRF保护的保护,因此即使 View 标记为protect_from_forgery,该表单也应该是CSRF格式的。 protected_post_transfer方法甚至不可能接受合法请求,因为从不发送真实性 token 。

我怀疑讲师没有这样做,因为测试是合法使用表格(击中未验证的端点,然后让它成功),然后指示学生尝试对 protected 端点进行CSRF(无论如何永远不会通过) ),因此您最终会测试两种不同的东西,这些东西会由于错误的原因而产生正确的结果。

关于ruby-on-rails - Rails 4在哪里将身份验证 token 存储在CSRF保护中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23465784/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com