Ruby on rails Rails为什么这样放置csrf令牌

Ruby on rails Rails为什么这样放置csrf令牌,ruby-on-rails,Ruby On Rails,我从未使用过Rails(这只能回答我的问题),但我看到它将CSRF令牌放在每个表单页面中。 我不明白的是为什么它使用两个meta标记: <meta name="csrf-token" content="<%= form_authenticity_token %>" /> <meta name="csrf-param" content="authenticity_token" /> 为什么不仅仅是csrf令牌元 <meta name="csrf-to

我从未使用过Rails(这只能回答我的问题),但我看到它将CSRF令牌放在每个表单页面中。
我不明白的是为什么它使用两个
meta
标记:

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

为什么不仅仅是csrf令牌元

<meta name="csrf-token" content="<%= form_authenticity_token %>" />


csrf-param
的用途是什么?

csrf-param包含参数的名称,csrf-token是参数的值。 因此,您的表单如下所示:

<form action="/" method="post">
  <input type="hidden" name="authenticity_token" value="OWY4NmQwODE4ODRjN2Q2NTlhMmZlYWEwYzU1YWQwMTVhM2JmNGYxYjJiMGI4MjkGTfMTVi
  MGYwMGEwOA==">
  …
  </form>

Rails允许您在后台进行大量与CSRF令牌相关的配置。如果愿意,您可以更改param的名称——但是如果您这样做,则需要知道新参数的名称(因为它在Ajax请求中使用)。这就是为什么这里有两个元参数:第一个显然是真实性令牌,但第二个是Rails的JavaScript驱动程序所必需的,以便知道第一个的名称。(您可以在或中看到这一点。)

你可能会争辩说这会让你陷入某种疯狂的循环——为什么不能用另一个元标记重命名
csrf param
meta标记?我认为这样做是为了让Rails能够轻松地采用现有的CSRF解决方案,而不需要大量的手动覆盖。此外,它还允许您的应用程序稍微经得起未来的考验。如果HTML5标准曾经为CSRF令牌采用官方标记,并且Rails选择在将来的版本中更改默认的CSRF标记,JavaScript驱动程序将根本不需要更改


归根结底,我认为这最接近它存在的真正原因:它是防止未来CSRF系统发生变化的保险,防止了不必要的、可能非常恼人的弃用。

如果使用单个元,则对参数名称的限制应始终相同。通过更改csrf参数内容,我可以将令牌的名称从“Authentity_token”更改为“my_token”,并且可以将值放在csrf令牌元内容下。好的,这是用于自定义问题的。