आप के बारे में अधिक जानने के लिए चाहते हैं यह और पता है कि कैसे एन्कोड या डीकोड काम करता है, कुछ प्रासंगिक कोड हैं। जिस तरह से मैं उपयोग करता हूं Django का संस्करण 1.9.4 है।
Django/योगदान/सत्र/बैकेंड/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/योगदान/सत्र/serializer.py SessionBase के एनकोड समारोह पर
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'))
आइए फोकस।
- एक 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'))
और वह सत्र.get_decoded() ने किया।
यह पाइथन 2.7 और Django 1.4 का उपयोग कर मेरे लिए काम नहीं करेगा। मेरे 'base64.decode' को फ़ाइल नाम तर्क की आवश्यकता है, इसलिए मैंने' base64.b64decode' को आजमाया, लेकिन यह "इंडेक्स एरर: सूची असाइनमेंट इंडेक्स सीमा से बाहर" लौटा। मुझे एक काम-आसपास मिला (नीचे जवाब देखें), लेकिन मुझे उत्सुकता है कि यह क्यों काम नहीं करता है। –
@ डोलन: अद्यतन उत्तर देखें, सुरक्षा चिंताओं के कारण सत्र_डेटा प्रारूप बदल गया। –