我从未使用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
有什么用?
答案 0 :(得分:5)
Rails允许您在与CSRF令牌相关的引擎盖下进行大量配置。如果您愿意,可以更改参数的名称 - 但如果这样做,jQuery UJS driver需要知道新参数的名称(因为它在Ajax请求中使用)。这就是为什么这里有两个元参数:第一个是实际的真实性令牌,显然,第二个是Rails的JavaScript驱动程序所需要的,以便甚至知道第一个的名称。 (您可以在jQuery driver或Prototype 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>