2011-01-29 5 views
7

Считается хорошей практикой безопасности для сброса cookie сеанса при аутентификации пользователя.Как сбросить JSESSIONID

Как это сделать с Java?

Моя попытка до сих пор успешно, но мне было интересно, если есть лучший способ:

public static HttpSession resetSessionId(HttpSession session, 
     HttpServletRequest request) { 
    session.invalidate(); 
    session = request.getSession(true); 
    return session; 
} 
+0

Я думаю, что это лучший способ ... –

ответ

2

Ваш ответ кажется оптимальным. Другой способ будет непосредственно управлять cookes таким образом:

Cookie cookie = new Cookie ("JSESSIONID", "randomValue"); 
cookie.setMaxAge(0); 

так вы создаете новый куки с тем же именем и немедленно истекают, но я не рекомендую идти таким путем, так как ваш намного чище и довольно очевидным для всех, кто знаком с базовыми API-интерфейсами Servlet.

+0

Я действительно использую это, потому что таким образом я смогу установить флаг «secure» равным false. Tomcat устанавливает его в true, потому что я аутентифицируюсь по SSL – Bozho

+0

ну, на самом деле это не сработало - как-то он отправил два идентичных JSESSIONID, вместо того, чтобы переопределять существующий. Поэтому на этот раз мне пришлось сбросить весь сброс. Но все же сохранение принятого ответа, как наиболее полное. – Bozho

3

Я только передать запрос, от которого я получаю сеанс. Если сеанс еще не существует, нет смысла создавать его для его недействительности. Это также выполняется, если сеанс только что был создан контейнером (из-за первого HTTP-запроса пользователя непосредственно в форме входа).

public static ... (HttpServletRequest request) { 
    HttpSession session = request.getSession(false); 
    if (session!=null && !session.isNew()) { 
     session.invalidate(); 
    } 
+0

Ну, сеанс должен существовать до аутентификации (я использую настраиваемую аутентификацию, без встроенных HTTP-аутентификаторов). Когда пользователь открывает страницу входа в систему, создается сеанс. – Bozho

+0

Я предпочитаю быть очень оптимальным в отношении создания сеанса в моем webapps. HTTP-сессия явно создается кодом Java только тогда, когда это необходимо. Отображение формы входа обычно не требует какой-либо обработки состояния. – cherouvim

+0

@Bozho, что говорит cherouvim, очень верно, обработка сеанса до аутентификации (или любого другого состояния) может быть легко использована для OOM DoS (просто вызовите страницу, создающую сеанс, но никогда не сохраняйте, то есть выполняя точно такой же запрос GET) , Поэтому я думаю, что это лучший ответ (наряду с комментарием) – bestsss

2

Tomcat (с версии 6.0.24 AFAIK) может автоматически изменить сеанс аутентификации при проверке подлинности - если вы используете стандартные механизмы проверки сервлетов (базовая, основанная на формах аутентификация). Это может быть сконфигурирован с помощью changeSessionIdOnAuthentication для базовой Authenticator Valve: http://tomcat.apache.org/tomcat-6.0-doc/config/valve.html

+0

спасибо, но я использую пользовательскую аутентификацию. – Bozho

1

Другой путь (не лучший способ), чтобы назвать «changeSessionId (existingSession)» из org.apache.catalina.session.StandardManager который изменит идентификатор сеанса текущего сеанса к новому случайно генерируемый идентификатор сеанса.

Чтобы вызвать этот метод, вы должны использовать StandardManager Mbean. Пожалуйста, см Tomcat MBeans

Псевдо код:

ObjectName contextObjectName = новый ObjectName ("Каталина: тип = менеджер, путь =/что, хост = whateverhost");

mbeanServer.invoke (contextObjectName, "changeSessionId", новый объект [] {session}, новый String [] {"javax.servlet.http.HttpSession"});