Защищённый куки
Предупреждение
Устаревшее с версии 0.15: Будет удалено в версии 1.0. Перемещено в https://github.com/pallets/secure-cookie.
werkzeug.contrib.securecookie
Этот модуль реализует куки, который нельзя изменить на клиенте, потому что он добавляет контрольную сумму, которую сервер проверяет. Вы можете использовать его как замену сессии, если у вас есть только идентификатор пользователя или что-то, чтобы отметить вошедшего пользователя.
Помните, что данные всё ещё читаемы клиентом как обычный куки. Однако вам не нужно хранить и сбрасывать сессии на сервере.
Пример использования:
>>> from werkzeug.contrib.securecookie import SecureCookie
>>> x = SecureCookie({"foo": 42, "baz": (1, 2, 3)}, "deadbeef")
Выгрузка в строку, чтобы можно было сохранить её в куки:
>>> value = x.serialize()
Загрузка из этой строки снова:
>>> x = SecureCookie.unserialize(value, "deadbeef") >>> x["baz"] (1, 2, 3)
Если кто-то изменяет куки, а контрольная сумма неверна, метод unserialize будет молча работать и вернёт новый пустой SecureCookie объект.
Помните, что значения будут видны в куки, поэтому не храните в куки данные, которые вы не хотите, чтобы пользователь видел.
Интеграция приложения
Если вы используете объекты запросов werkzeug, вы можете интегрировать защищённый куки в своё приложение так:
from werkzeug.utils import cached_property
from werkzeug.wrappers import BaseRequest
from werkzeug.contrib.securecookie import SecureCookie
# don't use this key but a different one; you could just use
# os.urandom(20) to get something random
SECRET_KEY = '\xfa\xdd\xb8z\xae\xe0}4\x8b\xea'
class Request(BaseRequest):
@cached_property
def client_session(self):
data = self.cookies.get('session_data')
if not data:
return SecureCookie(secret_key=SECRET_KEY)
return SecureCookie.unserialize(data, SECRET_KEY)
def application(environ, start_response):
request = Request(environ)
# get a response object here
response = ...
if request.client_session.should_save:
session_data = request.client_session.serialize()
response.set_cookie('session_data', session_data,
httponly=True)
return response(environ, start_response)
Более лаконичная интеграция может быть достигнута с помощью сокращённых методов:
class Request(BaseRequest):
@cached_property
def client_session(self):
return SecureCookie.load_cookie(self, secret_key=COOKIE_SECRET)
def application(environ, start_response):
request = Request(environ)
# get a response object here
response = ...
request.client_session.save_cookie(response)
return response(environ, start_response)
Безопасность
По умолчанию используется Pickle, так как это единственный модуль, который был доступен в стандартной библиотеке при создании этого модуля. Если у вас есть simplejson, настоятельно рекомендуется создать подкласс и заменить метод сериализации:
import json
from werkzeug.contrib.securecookie import SecureCookie
class JSONSecureCookie(SecureCookie):
serialization_method = json
Слабость Pickle заключается в том, что если кто-то получит доступ к секретному ключу, злоумышленник может не только изменить сессию, но и выполнить произвольный код на сервере.
Справочник
-
Представляет защищённый куки. Вы можете создать подкласс этого класса и предоставить альтернативный метод mac. Важно, что метод mac — это функция с интерфейсом, похожим на hashlib. Необходимые методы — update() и digest().
Пример использования:
>>> x = SecureCookie({"foo": 42, "baz": (1, 2, 3)}, "deadbeef") >>> x["foo"] 42 >>> x["baz"] (1, 2, 3) >>> x["blafasel"] = 23 >>> x.should_save TrueПараметры: -
данные – начальные данные. Это может быть словарь, список кортежей или
None. -
secret_key – секретный ключ. Если не указан
Noneили не задан, он должен быть установлен перед вызовомserialize(). -
new – начальное значение флага
new.
-
Trueесли куки был создан, иначеFalse
-
Всякий раз, когда элемент в куки устанавливается, этот атрибут устанавливается в
True. Однако это не отслеживает изменения внутри изменяемых объектов в куки:>>> c = SecureCookie() >>> c["foo"] = [1, 2, 3] >>> c.modified True >>> c.modified = False >>> c["foo"].append(4) >>> c.modified False
В этой ситуации его нужно установить вручную в
modified, чтобыshould_saveмог это обнаружить.
-
Метод хеширования для использования. Это должен быть модуль с новой функцией или функцией, которая создаёт объект hashlib. Например,
hashlib.md5Подклассы могут переопределять этот атрибут. По умолчанию хеш — sha1. Убедитесь, что вы обернули его в staticmethod(), если вы храните произвольную функцию, такую как hashlib.sha1, которая может быть реализована как функция.
-
Загружает
SecureCookieиз куки в запросе. Если куки не установлен, возвращается новыйSecureCookieэкземпляр.Параметры: -
запрос – объект запроса, у которого есть атрибут
cookies, являющийся словарем всех значений куки. - ключ – имя куки.
- secret_key – секретный ключ, используемый для декодирования куки. Всегда предоставляйте значение, даже если у него нет значения по умолчанию!
-
запрос – объект запроса, у которого есть атрибут
-
Котирование значения для куки. Это может быть любой объект, поддерживаемый
serialization_method.Параметры: значение – значение для котирования.
-
если содержимое должно быть закодировано в base64. Это может быть отключено, если процесс сериализации возвращает только безопасные для куки строки.
-
Сохранение SecureCookie в куки в объекте ответа. Все параметры, которые здесь не описаны, передаются напрямую в
set_cookie().Параметры: -
ответ – объект ответа, у которого есть метод
set_cookie(). - ключ – имя куки.
-
session_expires – дата истечения срока действия защищённого куки, хранящей информацию. Если это не указано, используется дата истечения куки
expiresвместо этого.
-
ответ – объект ответа, у которого есть метод
-
Модуль, используемый для сериализации. Должен иметь метод
dumpsи методloads, принимающий байты. По умолчаниюpickle.Изменено в версии 0.15: Значение по умолчанию для
pickleбудет изменено наjsonв версии 1.0.
-
Сериализация защищённого куки в строку.
Если expires указано, сессия будет автоматически аннулирована после истечения срока действия при её десериализации. Это обеспечивает лучшую защиту от кражи куки сессии.
Параметры: expires – необязательная дата истечения срока действия куки (объект datetime.datetime)
-
True, если сессия должна быть сохранена. По умолчанию это истинно только для куки
modified, а неnew.
-
Декодирование значения куки. Если декодирование не работает, возбуждается
UnquoteError.Параметры: значение – значение для декодирования.
-
Загрузка защищённого куки из сериализованной строки.
Параметры: - строка – значение куки для десериализации.
- secret_key – секретный ключ, используемый для сериализации куки.
Возвращает: новый
SecureCookie.
-
Внутреннее исключение, используемое для обозначения ошибок при котировании.
© 2007–2020 Pallets
Licensed under the BSD 3-clause License.
https://werkzeug.palletsprojects.com/en/0.16.x/contrib/securecookie/ -
данные – начальные данные. Это может быть словарь, список кортежей или