Java безопасный сеанс - PullRequest
6 голосов
/ 22 июля 2009

Всякий раз, когда вы аутентифицируетесь, ваше приложение должно изменить идентификатор сеанса, который оно использует. Это помогает предотвратить создание сеанса, копирование идентификатора сеанса, а затем обманом пользователя, использующего сеанс. Поскольку злоумышленник уже знает идентификатор сеанса, он может использовать его для доступа к сеансу после входа пользователя в систему, предоставляя им полный доступ. Эта атака была названа «фиксация сессии» среди прочего. Как я могу изменить идентификатор сессии после входа пользователя в систему?

Ответы [ 4 ]

9 голосов
/ 25 июля 2009

Вы все еще находитесь на сервере, пока вы отменяете сеанс.

//get stuff out of session you want before invalidating it.
currentSession = request.getSession(true);
UserProfile userProfile = (UserProfile) currentSession.getAttribute("userProfile");

//now invalidate it
currentSession.invalidate();

//get new session and stuff the data back in
HttpSession newSession = request.getSession(true);
newSession.setAttribute("userProfile", userProfile);
2 голосов
/ 22 июля 2009

Получить существующее; лишить законной силы это; создать новый ...

1) Получить текущий сеанс с помощью HttpServletRequest.getSession ();
2) Очистите сеанс: HttpSession.invalidate ();
3) Создайте новый: HttpServletRequest.getSession (true) ;

2 голосов
/ 22 июля 2009

Вообще говоря (поскольку это вообще не проблема Java, а общая проблема в сети), фиксация сеанса возникает, когда идентификаторы сеансов легко обнаружить или угадать. Основной метод атаки - это когда идентификатор сеанса находится в URL-адресе страницы, например http://example.com/index?sessionId=123.. Злоумышленник может настроить захват сеанса, а затем встроить ссылку на свою страницу, обманом заставив пользователя посетить его и стать часть их сессии. Затем, когда пользователь аутентифицирует, сеанс аутентифицируется. Для этого следует не использовать идентификаторы сеансов на основе URL, а вместо этого использовать файлы cookie

Некоторые веб-приложения будут использовать сеанс cookie, основанный на исходном URL-адресе, например, при посещении http://example.com/index?sessionId=123 будет отображаться идентификатор сеанса в URL-адресе, а затем создается из него файл cookie сеанса, который устанавливается в файл cookie сеанса для 123. Снижение для этого заключается в создании случайных идентификаторов сеансов на сервере без использования какого-либо пользовательского ввода в качестве начального числа для генератора.

Существуют также эксплойты на основе браузера, в которых плохо закодированный браузер будет принимать файлы cookie для доменов, которые не являются исходным доменом, но с этим ничего не поделаешь. И межсайтовый скриптинг атакует, где вы можете отправить команду сценария на атакованный сайт, чтобы установить cookie сеанса, который может быть уменьшен, если для cookie сеанса установлено значение HTTP_ONLY (хотя Safari не учитывает этот флаг)

Для Java общая рекомендация:

session.invalidate();
session=request.getSession(true); 

Однако в какой-то момент в JBoss это не сработало - поэтому вам нужно проверить, как это работает, в рамках выбранной вами платформы.

0 голосов
/ 21 июля 2009

Сделать недействительным текущий сеанс и получить новый сеанс:

//invalidate the current session
request.getSession().invalidate();
/*
get another session and get the ID (getSession()) will create a session if one does not exist
*/
request.getSession().getId();
...