Django, через SessionMiddleware
, устанавливает срок действия cookie HTTP на SESSION_COOKIE_AGE
.Это сообщает браузеру, когда cookie следует считать «слишком старым» и срок его действия истек.Это хорошая уборка.Кроме того, если браузер обнаружит, что cookie-файл больше не должен использоваться, он не будет его использовать, и это избавит Django от необходимости тратить время на изучение cookie-файла. в любом случае .
Тем не менее, Django не полагается на браузеры, чтобы гарантировать, что просроченные куки больше никогда не смогут использоваться .Мошеннический агент может получить копию файла cookie, а затем повторно использовать его после истечения срока его действия.Django предотвращает это, отправляя cookie в браузер в следующем формате:
<payload>:<creation stamp>:<signature>
Двоеточия - это разделители, которые появляются буквально в данных.<payload>
- фактические данные сеанса.<creation stamp>
- это отметка времени, добавленная при создании файла cookie, а <signature>
- это подпись MAC, которая подписывает полезную нагрузку и отметку о создании.
Соответствующий код можно увидеть в django.core.signing
.В комментариях вверху файла приведены основные сценарии подписи с использованием класса Signer
.Этот класс не знает о отметках времени.Однако при подписании файлов cookie Django использует TimestampSigner
, который знает о метках времени и создает формат, который я показал выше.
Когда TimestampSigner
unsigns cookie, он проверяет временную метку и вызывает исключение, если он слишком старый:
def unsign(self, value, max_age=None):
"""
Retrieve original value and check it wasn't signed more
than max_age seconds ago.
"""
result = super().unsign(value)
value, timestamp = result.rsplit(self.sep, 1)
timestamp = baseconv.base62.decode(timestamp)
if max_age is not None:
if isinstance(max_age, datetime.timedelta):
max_age = max_age.total_seconds()
# Check timestamp is not older than max_age
age = time.time() - timestamp
if age > max_age:
raise SignatureExpired(
'Signature age %s > %s seconds' % (age, max_age))
return value