我刚刚升级到rails 4.2.1 找到会话[:_ csrf_token]与csrf_meta_tags不同 我怀疑是因为我处于开发模式,但不知道为什么。
有谁知道为什么会发生这种变化? 谢谢!
答案 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