2011-02-25 35 views
5

一个例子是为什么Rails会话cookie无法完全解码Base64?一个Rails 2.3.8会话cookie的

BAh7BzoLZm9vYmFyaQc6D3Nlc3Npb25faWQiJWIzOTRhNGFkNDg1Mjk2NGM2NDU1Mzc4ZTM0YjkzZjE2--67046ba78aa6d656ec7c64e73aac156f5e503627 

因此我假定所述第二部分(--之后)是校验和,并且如果一个Base64解码完成:

$ script/console 
Loading development environment (Rails 2.3.8) 

> Base64.decode64("BAh7BzoLZm9vYmFyaQc6D3Nlc3Npb25faWQiJWIzOTRhNGFkNDg1Mjk2NGM2NDU1Mzc4ZTM0YjkzZjE2") 
=> "\004\b{\a:\vfoobari\a:\017session_id\"%b394a4ad4852964c6455378e34b93f16" 

> puts Base64.decode64("BAh7BzoLZm9vYmFyaQc6D3Nlc3Npb25faWQiJWIzOTRhNGFkNDg1Mjk2NGM2NDU1Mzc4ZTM0YjkzZjE2") 
{: 
    foobari:session_id"%b394a4ad4852964c6455378e34b93f16 

据说foobar应该有一个值为2,它不会显示...什么是session_id如果它是基于一个cookie - 为什么它需要一个id

回答

8

--之后的代码是SHA,与应用程序中定义的会话保密一起散列。

here about the ID

编辑:

Marshal.load(Base64.decode64("BAh7BzoLZm9vYmFyaQc6D3Nlc3Npb25faWQiJWIzOTRhNGFkNDg1Mjk2NGM2NDU1Mzc4ZTM0YjkzZjE2--67046ba78aa6d656ec7c64e73aac156f5e503627".split('--').first)) 

=> {:foobar=>2, :session_id=>"b394a4ad4852964c6455378e34b93f16"} 
+0

所以解码时,在之后删除'--'和十六进制字符串。所以它应该会很好,不是吗? – 2011-03-03 02:53:05

+0

@动静能量是的,然后你必须用元帅反序列化它。我编辑了我的答案。 – pseidemann 2011-03-17 07:35:39