Я не могу комментировать ответ @ cherouvim выше, так как мне не хватает очков. Новый идентификатор сеанса должен быть установлен "после", пользователь успешно вошел в систему, чтобы избежать фиксации сеанса. Я попытаюсь объяснить мои рассуждения.
Фиксация сеанса фактически означает, что злоумышленник каким-то образом обманул пользователя, используя значение, известное злоумышленнику. Для простоты давайте предположим, что злоумышленник подошел к столу пользователя, использовал Firebug и отредактировал cookie пользователя. Теперь, когда пользователь входит в систему, он / она будет входить в систему с помощью cookie-файла, управляемого злоумышленником. Поскольку злоумышленник также знает это значение, он / она обновит свой браузер, и ресурсы, сопоставленные с этим идентификатором сеанса (ресурсы жертвы), будут им предоставлены. Это фиксация сессии. Правильно?
Теперь предположим, что мы запустили session.invalidate до того, как пострадавший пользователь вошел в систему. Допустим, файл cookie изначально имел значение abc. При запуске session.invalidate значение abc удаляется из сеанса сервера.
Теперь наступает момент, когда я не согласен. Вы предлагаете создать новый сеанс до того, как пользователь фактически войдет в систему (вводит имя пользователя и пароль и нажимает кнопку «Отправить»). Это, без сомнения, приведет к созданию нового куки, но он будет в браузере пользователя, прежде чем они войдут в систему. Таким образом, если злоумышленник может изменить файл cookie «prelogin» еще раз, атака будет продолжена, поскольку этот файл cookie будет использоваться даже после входа пользователя в систему.
Я думаю, что это правильный поток.
- Пользователь делает GET /login.html
- Вернуть страницу входа с тем файлом cookie, который в данный момент находится в браузере
- Пользователь вводит учетные данные и нажимает кнопку отправки
- Приложение проверяет учетные данные
- При обнаружении, что учетные данные были правильными. session.invalidate () запускается .. уничтожает старый cookie.
- СЕЙЧАС создайте новый файл cookie, используя request.getSession (true)
Это означает, что даже если злоумышленнику удастся заставить вас использовать контролируемое значение перед входом в систему, вы все равно будете защищены ... поскольку приложение принудительно изменяет значение после входа в систему.
Вот хороший блог об этой проблеме - https://blog.whitehatsec.com/tag/session-fixation/