Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама

Які налаштування сесій Laravel впливають на безпеку?

Налаштування в config/session.php (і змінні SESSION_* у .env) безпосередньо визначають, наскільки легко викрасти чи підробити сесію.

Атрибути cookie:

Параметр Безпечне значення Навіщо
secure (SESSION_SECURE_COOKIE) true на продакшені cookie лише через HTTPS
http_only true (за замовчуванням) недоступна JavaScript - XSS не вкраде сесію
same_site lax (за замовчуванням) чи strict не надсилається в міжсайтових POST - захист від CSRF
domain null чи конкретний домен cookie для .example.com бачать усі піддомени, включно з тими, що можуть бути скомпрометовані
partitioned для вбудованих сторінок у сторонніх сайтах CHIPS - окреме сховище для кожного сайту-власника

SESSION_SECURE_COOKIE за замовчуванням не задано - Laravel не виставляє Secure, доки ви не ввімкнете. На продакшені з HTTPS - обов'язково true.

Драйвер сесій:

  • database, redis - дані на сервері, у cookie лише ідентифікатор. Можна переглянути й завершити сесії користувача («вийти з усіх пристроїв»);
  • cookie - усі дані сесії в зашифрованій cookie. Неможливо примусово завершити сесію на сервері, розмір обмежений, а витік APP_KEY дає підробку сесій;
  • file - на кількох серверах не працює без спільного сховища.

encrypt (SESSION_ENCRYPT) - шифрувати дані сесії у сховищі. Корисно, якщо в сесії бувають чутливі дані, а доступ до Redis чи таблиці сесій мають інші системи.

Терміни:

  • lifetime - хвилини неактивності до завершення сесії (за замовчуванням 120);
  • expire_on_close - сесія закінчується при закритті браузера;
  • для адмінок і фінансових застосунків - коротші терміни й повторне підтвердження пароля для чутливих дій.

Регенерація ідентифікатора:

  • після входу - $request->session()->regenerate() (стандартні контролери автентифікації роблять це) - захист від фіксації сесії;
  • при виході - invalidate() і regenerateToken().

Що ще перевірити:

  • окремі назви cookie (SESSION_COOKIE) для різних застосунків на одному домені - інакше вони перезаписують сесії одне одного;
  • SameSite=None (потрібна для вбудовування в iframe на інших сайтах) - лише з Secure і з усвідомленням, що захист від CSRF тепер повністю на токенах;
  • таблиця сесій містить IP і user agent - персональні дані з відповідним терміном зберігання.

Докладніше в документації: Laravel: налаштування сесій

Перевір себе

20 випадкових питань за спробу, після завершення - розбір кожної помилки

Схожі питання