gpt4 book ai didi

ruby-on-rails - 表单上的 Rails 真实性 token 与 csrf token

转载 作者:行者123 更新时间:2023-12-04 04:16:05 26 4
gpt4 key购买 nike

在 rails 4 应用程序的同一页面上,我有一个

在头部:

<meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="some_token" />

和下面的 body :
<form action="/someaction" method="post">
<input name="utf8" type="hidden" value="&#x2713;" />
<input type="hidden" name="_method" value="patch" />
<input type="hidden" name="authenticity_token" value="another_token" />

js 调用需要 csrf token 。但是为什么form token与csrf token不同呢?表单提交中使用了两个 token 中的哪一个?

最佳答案

我做了一些研究来回答你的问题,这里是结果。

首先我们来看这部分:

<meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="some_token" />

这部分由方法 csrf_meta_tags生成.从源代码我们可以看出:
  • <meta name="csrf-param" />的“内容”属性值取自 request_forgery_protection_token ,并且默认情况下为 :authenticity_token .
  • <meta name="csrf-token" />的“内容”属性值取自 form_authenticity_token方法,其中 token 要么从 session 中获取,要么生成。

  • 现在让我们看看这部分:
    <input type="hidden" name="authenticity_token" value="another_token" />

    从源码我们可以看出:
  • 此隐藏输入由 extra_tags_for_form 返回方法。
  • extra_tags_for_form调用 token_tag方法。
  • token_tag方法将 token 作为参数。
  • token token_tag 的论据之前提取自 options form_tag 的论据html_options_for_form 中的方法方法。

  • 所以如果你没有手动设置 authenticity_token参数在 options到您的自定义 token 并且不符合导致设置 token 的条件value 为 false(下面会提到), token_tag方法将收到 nil并调用相同的 form_authenticity_token用于 <meta name="csrf-token" /> 的方法标签创建。顺便说一下,用于填充 name输入的属性也使用 request_forgery_protection_token , 用于 <meta name="csrf-param" />标签生成发生。

    并且因为这一切都发生在同一个请求中,所以调用 form_authenticity_token方法在两种情况下都应该返回相同的结果。

    Which of the two tokens is used on form submission?



    提交表单时将使用隐藏输入中的 token 。

    token 来自 <meta />也可以使用,但前提是所有低于 conditions (使 token 方法的 token_tag 参数设置为 false)将满足:
  • :remote => true应该在 options 中传递的 form_tag .
  • embed_authenticity_token_in_remote_forms配置设置为false。
  • authenticity_token未通过 options .

  • But why is the form token different from the csrf token?



    至于这个问题,可能是因为缓存的缘故。或者,如果您使用 Turbolinks gem,可能会导致此问题(如果您完全刷新页面并再次比较 token ,则可以检查此问题)。有关 Turbolinks 问题的更多信息,请查看 this question .

    关于ruby-on-rails - 表单上的 Rails 真实性 token 与 csrf token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38870981/

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