Ogni volta che si effettua l'autenticazione, l'applicazione deve modificare l'identificativo di sessione utilizzato. Ciò aiuta a impedire a qualcuno di impostare una sessione, copiare l'identificatore di sessione e quindi indurre un utente a utilizzare la sessione. Poiché l'autore dell'attacco conosce già l'identificatore di sessione, può utilizzarlo per accedere alla sessione dopo che l'utente ha effettuato l'accesso, dando loro pieno accesso. Questo attacco è stato chiamato tra l'altro "aggiustamento della sessione". Come posso cambiare l'ID di sessione una volta che l'utente ha effettuato l'accesso al sistema?Sessione protetta Java
risposta
invalidare la sessione corrente e ottenere una nuova sessione:
//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();
Prendi il già esistente; invalidarlo; creane uno nuovo ...
1) Ottieni la sessione corrente con HttpServletRequest.getSession();
2) Cancella sessione: HttpSession.invalidate();
3) Creane uno nuovo: HttpServletRequest.getSession(true);
Se uso questo metodo, una volta che l'utente login farà prima il logout per rigenerare l'id –
come blowdart ha dichiarato: "Beh, questa è una limitazione del framework che stai usando, ho paura". Puoi fornire un esempio di codice del processo di autenticazione? Questo potrebbe aiutare. – Henrik
Parlare in generale (perché questo non è affatto un problema Java, è un problema generale del Web) si verifica quando gli ID di sessione sono facili da individuare o indovinare. Il metodo principale di attacco è quando l'ID di sessione si trova nell'URL di una pagina, ad esempio http://example.com/index?sessionId=123. Un utente malintenzionato può configurare l'acquisizione di una sessione e quindi incorporare il collegamento nella sua pagina, inducendo un utente a visitarlo e diventare parte della propria sessione. Quindi, quando l'utente autentica la sessione viene autenticata. La mitigazione per questo è di non usare ID di sessione basati su URL, ma invece di usare i cookie
Alcune applicazioni web utilizzeranno una sessione di cookie basata ma impostandola dall'URL iniziale, ad esempio visitando http://example.com/index?sessionId=123 vedrebbe l'id di sessione nell'URL e quindi creare un cookie di sessione da esso, impostando l'id nel cookie di sessione su 123. La mitigazione per questo è di generare id di sessione casuali sul server senza utilizzare alcun input utente come seed nel generatore.
Ci sono anche exploit basati su browser in cui un browser mal codificato accetterà la creazione di cookie per domini che non sono il dominio di origine, ma non c'è molto che tu possa fare al riguardo. E attacchi Cross Site Scripting in cui è possibile inviare un comando di script nel sito attaccato per impostare il cookie di sessione, che può essere mitigato impostando il cookie di sessione come HTTP_ONLY (sebbene Safari non rispetti questo flag)
Per Java il raccomandazione generale è
session.invalidate();
session=request.getSession(true);
Tuttavia a un certo punto su JBoss questo non ha funzionato - quindi è necessario controllare questo funziona come previsto all'interno del vostro quadro prescelto.
Provo a utilizzare questo metodo, ma l'utente verrà disconnesso è session.invalidate() è chiamato –
Bene, questa è una limitazione del framework che si sta usando, temo. – blowdart
sto usando jsf e tomcat, quindi ho qualche altro metodo per risolvere il problema? –
Sei ancora sul server mentre invalidi la sessione.
//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);
C'è una ragione per cui l'hai chiesto due volte? http://stackoverflow.com/questions/1138436/can-i-regenerate-my-own-session-id-in-servlet – blowdart
sì non posso aggiungere il commento e rispondere al messaggio –