2014-02-18 15 views
1

我正在使用Flask的會話,它在響應中設置了一個簽名的cookie頭。Flask會話不JSON序列化Cookie

from flask import session 

這設置了一個名爲session的cookie,其中a = 1

a = session.get('a', None) 
session['a'] = 1 
return jsonify(a = a) 

在代碼中的jsonify只是表明cookie將被下一個請求被讀取,它是。這是對第二個請求的迴應

{ 
    "a": 1 
} 

我需要在客戶端讀取cookie。所以我希望它是JSON編碼。這是響應中的Set-Cookie標頭

Set-Cookie: session=eyJhIjoxfQ.BeUPPQ.Al5bwLzcAsN2f15mdREzhGWP1uc; HttpOnly; Path=/ 

它不是JSON序列化的。

燒瓶版本是0.10.1。從版本0.10開始,它使用itsdangerous的會話,主要優勢在於JSON序列化Cookie,而不是之前使用的Pickle序列化。

我錯過了什麼? Flask版本爲0.10.1

回答

4

您誤解了默認Flask會話實現的格式。 session對象產生加密簽名的JSON,然後(可選)進行壓縮,然後使用base64編碼來存儲會話值,以確保客戶端不會篡改存儲在其中的值。在你的情況下,沒有應用壓縮(壓縮只適用於這減少了最終輸出尺寸)。

這是從以前的格式改爲使用pickle來限制攻擊者在服務器端機密受到攻擊時可能造成的損害(請參閱blog post of mine爲什麼pickle可能是危險的)。

換句話說,所有Flask所做的都是將串行器從pickle換成擴展標記的JSON格式,但預先存在的加密簽名和壓縮已保留。因爲這樣的格式並不適合在客戶端再次解碼(你必須解碼base64,可能解壓縮數據,拆分簽名,並且你可能不得不解釋額外的類型標記) 。你可以切換會話實現,但這是非常不推薦。

如果您想與客戶端共享數據,您可以將數據嵌入<script>區塊的頁面中,並使用var session_data = {{data|tojson|safe}};或與數據一起設置單獨的cookie。

+0

對不起,我不清楚。請閱讀重寫的問題。 –

+0

@ClodoaldoNeto:然後刪除了關於'jsonify'的部分;其餘的依然存在。 –

+0

@MartijnPieters爲什麼flask [docs](http://flask.pocoo.org/docs/0.11/quickstart/#sessions)建議祕密密鑰僅用於簽名數據,而不用於加密:_這意味着什麼用戶可以查看cookie的內容,但不能修改它,除非他們知道用於簽名的密鑰_?是文檔中的錯誤,最近的變化還是我誤解的東西? – max