Может ли сервлет получить идентификатор сеанса HTTPS? - PullRequest
5 голосов
/ 07 июня 2011

Я хочу создать веб-приложение без сохранения состояния с использованием Java-сервлетов.Поскольку он не имеет состояния, HttpSession отсутствует.В браузере есть сеанс, но каждый запрос может обрабатываться другим узлом в кластере.Идентификатор сеанса, хранящийся в браузере, генерируется и шифруется сервером, поэтому кому-то очень сложно создать действительный поддельный идентификатор сеанса и обойти логин.

Недавно я обнаружил уязвимость в этой архитектуре: если злонамеренный(зараженный) браузер отправляет идентификатор сеанса бандиту, сеанс может быть легко взломан.Я не могу сгенерировать идентификатор сеанса при каждом запросе, потому что на сервере нет сеанса для отслеживания ожидаемой последовательности запросов, и это также усложнит обработку асинхронных запросов.

Мое решение до сих пор заключается в получении некоторого HTTPSидентификатор сеанса и включите его в зашифрованный идентификатор сеанса, который хранится в браузере.Может ли стандартный сервлет получить такую ​​информацию из HTTPS-соединения?

Другой вариант - использовать HttpSession только для getId (), но это будет работать только в том случае, если такой идентификатор связан с сеансом HTTPS, который я не смог найти вСпецификация сервлета.

Другие предложения приветствуются.

1 Ответ

7 голосов
/ 07 июня 2011

Контейнер сервлета заполняет идентификатор сеанса SSL в атрибуте HttpServletRequest, который будет использоваться нижестоящими компонентами.Имя атрибута оказывается javax.servlet.request.ssl_session_id.Насколько мне известно, это доступно во всех контейнерах, реализующих спецификацию сервлета 3.0.До Servlet Spec 3.0 это было доступно в ограниченных контейнерах - Tomcat и Jetty, если я не ошибаюсь.

Однако следует помнить, что идентификатор сеанса SSL считается более безопасным, чем сгенерированный контейнером файл cookie сеанса HTTPзначение.Утечка идентификатора сеанса SSL сделает даже ваши HTTPS-соединения небезопасными.

...