ruby Rails 4真实性令牌-在头和表单中隐藏输入?

wgmfuz8q  于 2023-04-29  发布在  Ruby
关注(0)|答案(2)|浏览(85)

我试图在Rails中实现全页面缓存,但在CSRF方面遇到了一个很大的障碍--或者可能只是我对它的理解。我目前将form_authenticity_token字符串存储在一个cookie中,JS可以访问并重写头标记。
在生成的HTML中,我可以在两个地方找到标记:
1)打在头上
<meta name="csrf-token" content="[hash]">
2)在窗体的隐藏输入元素内部
<input type="hidden" name="authenticity_token" value="[different hash]">
如前所述,这些散列彼此不同(在未启用缓存的开发模式下)。为什么他们不一样?为什么我可以删除头 meta标记,并留下表单输入单独的请求是允许的?但是当我删除表单输入标记并保留标题时,请求被拒绝了?
实际上这意味着头部标签是无用的,不是吗?我可以将表单输入标记重写为cookie中的值,就像我对header标记所做的那样,但由于它们彼此不同,我对最终结果可能意味着什么持谨慎态度,特别是当涉及到整个页面缓存时。
应用程序控制器包含:

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
f87krz0w

f87krz0w1#

在另一个问题上,我找到了答案。简而言之,Rails通过自动将CSRF令牌插入 AJAX 请求来帮助jQuery用户。它在 meta标记中查找它。
因此,在表单中包含CSRF令牌对于提交POST请求非常有用,并且在头部包含它对于 AJAX 请求的时间/精力/错误非常有用。
也许这两种方式都有好处,因为你可能想在没有表单的时候发出 AJAX 请求。如果有一个表单并且javascript被禁用,那么将其放在头中不会给任何人带来任何好处,因为它不会包含在POST请求中。
至于为什么它们不同,我只能猜测这与生成时的算法有关。..但这不是这里或那里,因为两个令牌工作。

siv3szwd

siv3szwd2#

authentication_token不同的原因是因为RoR正在使用具有应用于真实性令牌的随机XOR掩码的掩蔽authentication_token。使用它是因为它可以减轻像BREACH这样的SSL攻击。
https://apidock.com/rails/v6.1.3.1/ActionController/RequestForgeryProtection/mask_token

相关问题