httpservletrequest - создать новый сеанс / изменить идентификатор сеанса - PullRequest
34 голосов
/ 22 февраля 2010

Я поддерживаю веб-приложение на Java.

Изучая код входа в систему, он получает HttpSession из HttpServletRequest через метод getSession () HttpServletRequest. (Он использует некоторые значения в сеансе для аутентификации)

Однако меня беспокоят атаки с фиксацией сеанса, поэтому после использования начального сеанса я хочу либо начать новый сеанс, либо изменить идентификатор сеанса. Возможно ли это?

Ответы [ 2 ]

40 голосов
/ 22 февраля 2010

API Servlet 3.0 не позволяет изменять идентификатор сеанса в существующем сеансе. Как правило, для защиты от фиксации сеанса вам нужно просто создать новый и аннулировать старый.

Вы можете сделать недействительным сеанс, подобный этому

request.getSession(false).invalidate();

, а затем создайте новый сеанс с

getSession(true) (getSession() тоже должно работать)

Очевидно, что если у вас есть данные в сеансе, которые вы хотите сохранить, вам нужно скопировать их из первого сеанса во второй сеанс.

Обратите внимание, что для защиты фиксации сеанса обычно принято делать это по запросу аутентификации. Но более высокий уровень безопасности предполагает сброс старого сеанса и создание нового сеанса для каждого запроса.

25 голосов
/ 07 августа 2014

Начиная с Java EE 7 и Servlet API 3.1 (Tomcat 8) вы можете использовать HttpServletRequest.changeSessionId () для достижения такого поведения. Также есть слушатель HttpSessionIdListener, который будет вызываться после каждого изменения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...