Фіксація сесії (session fixation): нападник заздалегідь отримує ID сесії (просто відкривши сайт) і змушує жертву використовувати цей самий ID - через посилання з параметром, вразливість на піддомені, що встановлює cookie. Жертва входить в обліковий запис, сесія стає автентифікованою - а її ID нападник уже знає.
Захист - новий ID сесії при зміні рівня привілеїв: після входу, після підвищення прав (вхід в адмінку, підтвердження пароля), після виходу.
if (Auth::attempt($credentials)) {
$request->session()->regenerate(); // новий ID, дані сесії збережено
return redirect()->intended('/dashboard');
}
// вихід
Auth::logout();
$request->session()->invalidate(); // знищити сесію
$request->session()->regenerateToken(); // новий CSRF-токен
Стартові набори Laravel (Breeze, Jetstream, Fortify) роблять це автоматично; у власній логіці входу про це легко забути.
Інші правила керування сесіями:
- ID лише в cookie (
HttpOnly,Secure,SameSite), ніколи в URL: звідти він потрапляє в логи, історію браузера й заголовокReferer. - Не приймати ID сесії, які сервер не видавав (строгий режим,
session.use_strict_modeу PHP). - Тайм-аути: неактивності (наприклад, 30 хвилин для чутливих застосунків) і абсолютний.
- Вихід на всіх пристроях після зміни пароля (
Auth::logoutOtherDevices()у Laravel). - Повторне підтвердження пароля перед критичними діями - зміною email, видаленням облікового запису.