2011-01-29 15 views
7

È considerata una buona pratica di sicurezza ripristinare il cookie di sessione quando un utente effettua l'autenticazione.Come resettare JSESSIONID

Come fare questo con Java?

Il mio tentativo finora è successo, ma mi chiedevo se c'è un modo migliore:

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

Penso che sia il modo migliore ... –

risposta

2

La tua risposta sembra ottimale. Un altro modo sarebbe quello di manipolare direttamente cookes in questo modo:

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

in modo da creare un nuovo cookie con lo stesso nome e subito scadono, ma io non raccomandare andare in questo modo dal momento che il vostro è molto più pulito ed è abbastanza ovvio per chiunque abbia familiarità con le API di servlet di base.

+0

Veramente uso questo, perché così potrò impostare il flag "sicuro" su falso. Tomcat lo imposta su 'true', perché sto eseguendo l'autenticazione via SSL – Bozho

+0

, in realtà non ha funzionato: in qualche modo ha inviato due JSESSIONID identici, anziché ignorare quello esistente. Quindi ho dovuto abbandonare l'intero ripristino per ora. Ma ancora conservando la risposta accettata, come la più completa. – Bozho

3

passo solo la richiesta da cui ricevo la sessione. Se una sessione non esiste ancora, non ha senso crearne una solo per invalidarla. Ciò vale anche se la sessione è stata appena creata dal contenitore (a causa della prima richiesta HTTP dell'utente direttamente nel modulo di accesso).

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

beh, una sessione dovrebbe esistere prima dell'autenticazione (io uso un'autenticazione personalizzata, nessun auth http incorporato). Quando l'utente apre la pagina di accesso, viene creata una sessione. – Bozho

+0

Preferisco essere molto ottimale per quanto riguarda la creazione di sessioni nelle mie applicazioni web. Una sessione http viene esplicitamente creata dal codice Java solo quando richiesto. La visualizzazione di un modulo di accesso di solito non richiede alcuna gestione dello stato. – cherouvim

+0

@Bozho, ciò che dice cherouvim è molto vero, la gestione della sessione prima dell'autenticazione (o qualsiasi altro stato richiesto) può essere facilmente sfruttata per OOM DoS (basta chiamare la pagina per creare la sessione ma mai archiviare, cioè eseguire esattamente la stessa richiesta GET) . Quindi immagino che questa sia la migliore risposta (insieme al commento) – bestsss

2

Tomcat (dal 6.0.24 AFAIK) può modificare automaticamente l'ID sessione sull'autenticazione, purché si utilizzino meccanismi di autenticazione servlet standard (autenticazione basata su modulo, base). Questo può essere configurato tramite changeSessionIdOnAuthentication per l'Authenticator valvola di base: http://tomcat.apache.org/tomcat-6.0-doc/config/valve.html

+0

grazie, ma sto utilizzando un'autenticazione personalizzata. – Bozho

1

Un altro modo (non il modo migliore) è quello di chiamare 'changeSessionId (existingSession)' di org.apache.catalina.session.StandardManager che cambierà l'ID di sessione della sessione corrente in un nuovo modo casuale ID sessione generato.

È necessario utilizzare StandardManager Mbean per richiamare tale metodo. Si prega di consultare Tomcat MBeans

Pseudo codice:

ObjectName contextObjectName = new ObjectName ("Catalina: type = Manager, path =/qualunque cosa, host = whateverhost");

mbeanServer.invoke (contextObjectName, "changeSessionId", nuovo oggetto [] {sessione}, nuova stringa [] {"javax.servlet.http.HttpSession"});