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

Raú*_*ràs 3 ruby-on-rails

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

<meta name="csrf-token" content="<%= form_authenticity_token %>" />
<meta name="csrf-param" content="authenticity_token" />
Run Code Online (Sandbox Code Playgroud)

为什么不只是csrf-token元?

<meta name="csrf-token" content="<%= form_authenticity_token %>" />
Run Code Online (Sandbox Code Playgroud)

有什么用csrf-param

Ver*_*cus 5

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

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

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