Боб Белдербос: Ссылки для отписки без входа в систему: подпись Django
Модуль подписи Django позволяет создавать безопасные ссылки для отписки без необходимости входа пользователя или сессий. Небезопасный подход, напрямую использующий идентификаторы пользователей в URL, уязвим для массовых отписок. Хранение случайных токенов в базе данных является распространенным, но более сложным решением. Модуль django.core.signing в Django предоставляет токены с защитой от подделки, не требуя хранения в базе данных, подписывая значение (например, первичный ключ пользователя) с помощью SECRET_KEY."Соль" имеет решающее значение для предотвращения коллизий токенов между различными функциями, гарантируя, что токен для одной цели (например, анонсов) не может быть использован для другой (например, уведомлений форума). Несмотря на подпись, токены не являются секретными; данные внутри них читаемы, но не могут быть изменены без аннулирования подписи. Поэтому не подписывайте конфиденциальную информацию, предназначенную для скрытия.Критически важно, чтобы действия по отписке происходили по POST-запросу, а не по GET-запросу, чтобы предотвратить случайную отписку пользователей почтовыми сканерами и префетчерами. Рекомендуемый поток — страница подтверждения по GET, за которой следует POST для завершения действия.Токены отписки часто не требуют срока действия, так как повторное нажатие на старую ссылку дает тот же безопасный результат. Однако для конфиденциальных действий, таких как ссылки для магического входа, аргумент max_age в signing.loads обеспечивает срок действия без хранения в базе данных. Для сценариев с одноразовыми токенами, таких как проверка электронной почты, требуется дополнительное управление состоянием (запись в базе данных использованных токенов), поскольку сама по себе подпись не может отслеживать использование.
django.core.signingв Django предоставляет токены с защитой от подделки, не требуя хранения в базе данных, подписывая значение (например, первичный ключ пользователя) с помощьюSECRET_KEY."Соль" имеет решающее значение для предотвращения коллизий токенов между различными функциями, гарантируя, что токен для одной цели (например, анонсов) не может быть использован для другой (например, уведомлений форума). Несмотря на подпись, токены не являются секретными; данные внутри них читаемы, но не могут быть изменены без аннулирования подписи. Поэтому не подписывайте конфиденциальную информацию, предназначенную для скрытия.Критически важно, чтобы действия по отписке происходили по POST-запросу, а не по GET-запросу, чтобы предотвратить случайную отписку пользователей почтовыми сканерами и префетчерами. Рекомендуемый поток — страница подтверждения по GET, за которой следует POST для завершения действия.Токены отписки часто не требуют срока действия, так как повторное нажатие на старую ссылку дает тот же безопасный результат. Однако для конфиденциальных действий, таких как ссылки для магического входа, аргументmax_ageвsigning.loadsобеспечивает срок действия без хранения в базе данных. Для сценариев с одноразовыми токенами, таких как проверка электронной почты, требуется дополнительное управление состоянием (запись в базе данных использованных токенов), поскольку сама по себе подпись не может отслеживать использование.