2011-02-25 38 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