我试图在 Rails 中获得整页缓存,但我在 CSRF 方面遇到了很大的障碍——或者可能只是我对它的理解。我目前将form_authenticity_token
字符串存储在 JS 可以访问和重写标题标签的 cookie 中。
我在生成的 HTML 中有两个地方可以找到标记:
1)在头部
<meta name="csrf-token" content="[hash]">
2) 在表单的隐藏输入元素内
<input type="hidden" name="authenticity_token" value="[different hash]">
如前所述,这些哈希值彼此不同(在未启用缓存的开发模式下)。为什么它们不同?为什么我可以删除头部元标记并单独保留表单输入并且允许请求?然而,当我删除表单输入标签并留下标题时,请求被拒绝了?
实际上,这意味着头部标签是无用的,不是吗?我可以将表单输入标签重写为我的 cookie 中的值,就像我对标题标签所做的那样,但由于它们彼此不同,我对最终结果可能意味着什么持谨慎态度,尤其是在涉及整页缓存时.
应用程序控制器包含:
protect_from_forgery with: :exception
before_filter :csrf_cookie
def csrf_cookie
cookies['authenticity-token'.freeze] = {
value: form_authenticity_token,
expires: 1.day.from_now,
secure: (Rails.env.staging? || Rails.env.production?)
}
end