From 1c1a95df76f780835a00487ccbe02d96ff218ddc Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Wed, 7 Jan 2026 20:40:21 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BA=D0=B0=D1=81=D1=82=D0=BE=D0=BC=D0=BD=D0=B0?= =?UTF-8?q?=D1=8F=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D0=B0=20?= =?UTF-8?q?=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20CSRF=20=D0=B8=20=D1=83?= =?UTF-8?q?=D0=B2=D0=B5=D0=BB=D0=B8=D1=87=D0=B5=D0=BD=D0=BE=20=D0=B2=D1=80?= =?UTF-8?q?=D0=B5=D0=BC=D1=8F=20=D1=81=D0=B5=D1=81=D1=81=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Создан шаблон templates/403_csrf.html с дружелюбным интерфейсом для пользователей * Красивый дизайн с градиентом и анимациями * Понятное объяснение причин ошибки (истёкшая сессия, кнопка Назад) * Кнопка обновления страницы для быстрого решения * Адаптивная вёрстка для мобильных устройств - Увеличено время жизни сессии в settings.py: * SESSION_COOKIE_AGE = 28 дней (было по умолчанию 2 недели) * SESSION_SAVE_EVERY_REQUEST = True (продлевать при активности) * CSRF_COOKIE_AGE = 1 год (чтобы токен не устаревал быстро) * Добавлены флаги безопасности SECURE для прода (HTTPS-only) Теперь на проде пользователи не увидят технический текст ошибки CSRF, а получат понятное сообщение с инструкцией по решению проблемы. --- myproject/docker/.env.docker.example | 32 ------- myproject/myproject/settings.py | 21 ++++ myproject/templates/403_csrf.html | 137 +++++++++++++++++++++++++++ 3 files changed, 158 insertions(+), 32 deletions(-) delete mode 100644 myproject/docker/.env.docker.example create mode 100644 myproject/templates/403_csrf.html diff --git a/myproject/docker/.env.docker.example b/myproject/docker/.env.docker.example deleted file mode 100644 index 21afb52..0000000 --- a/myproject/docker/.env.docker.example +++ /dev/null @@ -1,32 +0,0 @@ -# Django settings -SECRET_KEY=change-this-to-a-secure-random-key-in-production-min-50-chars -DEBUG=False -ALLOWED_HOSTS=yourdomain.com,*.yourdomain.com,localhost,127.0.0.1 - -# Database (PostgreSQL) -DB_NAME=inventory_db -DB_USER=postgres -DB_PASSWORD=your-secure-postgres-password-here -DB_HOST=db -DB_PORT=5432 - -# Redis -REDIS_HOST=redis -REDIS_PORT=6379 -REDIS_DB=0 - -# Celery -CELERY_BROKER_URL=redis://redis:6379/0 - -# Tenant Admin (создаётся при первом запуске) -TENANT_ADMIN_EMAIL=admin@example.com -TENANT_ADMIN_PASSWORD=change-this-secure-password -TENANT_ADMIN_NAME=Admin - -# Django-tenants -# Основной домен для public схемы -PUBLIC_SCHEMA_DOMAIN=yourdomain.com - -# Domain settings for multi-tenant URLs -TENANT_DOMAIN_BASE=yourdomain.com -USE_HTTPS=True diff --git a/myproject/myproject/settings.py b/myproject/myproject/settings.py index 4229902..7806706 100644 --- a/myproject/myproject/settings.py +++ b/myproject/myproject/settings.py @@ -228,6 +228,27 @@ USE_I18N = True USE_TZ = True +# ============================================ +# SESSION CONFIGURATION +# ============================================ + +# Время жизни сессии: 4 недели (в секундах) +SESSION_COOKIE_AGE = 2419200 # 28 дней + +# Продлевать сессию при каждом запросе (токен не устареет, если пользователь активен) +SESSION_SAVE_EVERY_REQUEST = True + +# Время жизни CSRF cookie (привязан к сессии, но можно увеличить отдельно) +# 1 год для удобства пользователей +CSRF_COOKIE_AGE = 31449600 + +# CSRF cookie доступен только по HTTPS на проде +CSRF_COOKIE_SECURE = not DEBUG + +# Session cookie доступен только по HTTPS на проде +SESSION_COOKIE_SECURE = not DEBUG + + # ============================================ # STATIC FILES (CSS, JavaScript, Images) # ============================================ diff --git a/myproject/templates/403_csrf.html b/myproject/templates/403_csrf.html new file mode 100644 index 0000000..18e80ed --- /dev/null +++ b/myproject/templates/403_csrf.html @@ -0,0 +1,137 @@ + + + + + + Сессия истекла + + + +
+
🔒
+

Сессия истекла

+

Ваша форма была открыта слишком давно, и защитный токен безопасности устарел.

+ +
+ Возможные причины: +
    +
  • Страница была открыта более 30 минут
  • +
  • Использована кнопка "Назад" в браузере
  • +
  • Открыто несколько вкладок с этой формой
  • +
+
+ +

Решение простое: обновите страницу и попробуйте снова.

+ + +
+ +