session [:_ csrf_token]与rails 4.2.1中的csrf_meta_tags不同

时间:2015-03-23 06:27:42

标签: ruby-on-rails

我刚刚升级到rails 4.2.1 找到会话[:_ csrf_token]与csrf_meta_tags不同 我怀疑是因为我处于开发模式,但不知道为什么。

有谁知道为什么会发生这种变化? 谢谢!

2 个答案:

答案 0 :(得分:1)

从rails 4.2开始,添加到表单或元标记中的令牌为masked:它使用32位值(构成提交值的一部分)加密,并根据请求进行更改。

这种掩蔽不会使令牌更加秘密 - 它有助于减轻攻击,例如BREACH

答案 1 :(得分:0)

正如@ frederick-cheung已经说过,form authenticity token现在是masked,并且随着每个请求而变化,以减轻SSL攻击。

Here是一个代码示例,演示如何取消屏蔽form authenticity token以将其与session[:_csrf_token]进行比较

def unmask_authenticity_token(authenticity_token)
  # this must be the same as ActionController::RequestForgeryProtection::AUTHENTICITY_TOKEN_LENGTH
  token_length = 32

  masked_token = Base64.strict_decode64(authenticity_token)

  one_time_pad = masked_token[0...token_length]
  encrypted_csrf_token = masked_token[token_length..-1]

  bytes = encrypted_csrf_token.bytes
  one_time_pad.each_byte.with_index { |b, i| bytes[i] ^= b }

  Base64.strict_encode64(bytes.pack("C*"))
end