如果您想了解更多關於它並知道如何編碼或解碼工作,有一些相關的代碼。 順便說一下,我使用的Django版本是1.9.4。
Django的/的contrib /會話/後端/ base.py
class SessionBase(object):
def _hash(self, value):
key_salt = "django.contrib.sessions" + self.__class__.__name__
return salted_hmac(key_salt, value).hexdigest()
def encode(self, session_dict):
"Returns the given session dictionary serialized and encoded as a string."
serialized = self.serializer().dumps(session_dict)
hash = self._hash(serialized)
return base64.b64encode(hash.encode() + b":" + serialized).decode('ascii')
def decode(self, session_data):
encoded_data = base64.b64decode(force_bytes(session_data))
try:
# could produce ValueError if there is no ':'
hash, serialized = encoded_data.split(b':', 1)
expected_hash = self._hash(serialized)
if not constant_time_compare(hash.decode(), expected_hash):
raise SuspiciousSession("Session data corrupted")
else:
return self.serializer().loads(serialized)
except Exception as e:
# ValueError, SuspiciousOperation, unpickling exceptions. If any of
# these happen, just return an empty dictionary (an empty session).
if isinstance(e, SuspiciousOperation):
logger = logging.getLogger('django.security.%s' %
e.__class__.__name__)
logger.warning(force_text(e))
return {}
Django的/的contrib /會話/ serializer.py
class JSONSerializer(object):
"""
Simple wrapper around json to be used in signing.dumps and
signing.loads.
"""
def dumps(self, obj):
return json.dumps(obj, separators=(',', ':')).encode('latin-1')
def loads(self, data):
return json.loads(data.decode('latin-1'))
讓我們專注於SessionBase的編碼功能。
- 序列化會話字典的JSON
- 創建哈希鹽
- 鹽添加到系列化會議,Base64編碼的串聯
因此,解碼是逆。 我們可以在下面的代碼中簡化解碼功能。
import json
import base64
session_data = 'YTUyYzY1MjUxNzE4MzMxZjNjODFiNjZmZmZmMzhhNmM2NWQzMTllMTp7ImNvdW50Ijo0fQ=='
encoded_data = base64.b64decode(session_data)
hash, serialized = encoded_data.split(b':', 1)
json.loads(serialized.decode('latin-1'))
而session.get_decoded()做了什麼。
這對我來說不適用於使用Python 2.7和Django 1.4。我的'base64.decode'需要文件名參數,所以我嘗試'base64.b64decode',但是這返回「IndexError:列表分配索引超出範圍」。我發現了一個解決方法(見下面的答案),但我很好奇爲什麼這不起作用。 – 2012-08-21 13:47:05
@dolan:看到更新後的答案,由於安全考慮,session_data格式發生了變化。 – 2013-10-15 22:11:40