4

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

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

为什么不只是 csrf-token 元数据?

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

有什么用csrf-param

4

2 回答 2

6

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

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

最终,我认为这最接近它存在的真正原因:它可以防止 CSRF 系统的未来变化,防止不必要的和可能非常烦人的弃用。

于 2012-08-30T15:22:23.400 回答
2

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

<form action="/" method="post">
  <input type="hidden" name="authenticity_token" value="OWY4NmQwODE4ODRjN2Q2NTlhMmZlYWEwYzU1YWQwMTVhM2JmNGYxYjJiMGI4MjkGTfMTVi
  MGYwMGEwOA==">
  …
  </form>
于 2012-08-30T14:43:08.717 回答