为什么Rails会像这样放置csrf令牌

时间:2012-08-30 14:14:08

标签: ruby-on-rails

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

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

为什么不只是csrf-token meta?

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

csrf-param有什么用?

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:2)

csrf-param包含参数​​的名称,csrf-token是参数的值。 所以,你的表单看起来像这样:

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