2013-10-07 13 views
8

Mi piace molto l'idea di mantenere i dati di sessione sul browser degli utenti ma non mi piace il fatto che i cookie di sessione non siano molto sicuri nel framework di gioco. Se qualcuno ruba il cookie, potrebbe usarlo per accedere in modo permanente al sito poiché la firma del cookie non sta scadendo e la scadenza del cookie non aiuta qui perché non si ferma dal riutilizzo del cookie se qualcuno lo ha rubato.Modi migliori per implementare più sicurezza Esegui la sessione del framework Scala tramite cookie

Ho aggiunto il timestamp per scadere della sessione dopo 1 ora e ogni 5 minuti per aggiornare la data e l'ora se l'utente sta ancora utilizzando il sito in modo che la firma del cookie stia scadendo.

Sono abbastanza nuovo per scala e struttura di gioco, quindi qualsiasi suggerimento o modi migliori per ottenere lo stesso sarebbe molto apprezzato.

trait Secured { 
    def withAuth(f: => String => Request[AnyContent] => Result) = { 
    Security.Authenticated(username, onUnauthorized) { user => 
     Action(request => { 

      val sessionRolloverPeriod = 300 
      val sessionExpiryTime = 3600 
      val sessionCreationTime: Int = request.session("ts").toInt 
      val currentTime = System.currentTimeMillis()/1000L 

      if(currentTime <= (sessionCreationTime + sessionExpiryTime)) { 
      if(currentTime >= (sessionCreationTime + sessionRolloverPeriod)) { 
       f(user)(request).withSession(request.session + ("ts" -> (System.currentTimeMillis()/1000L).toString)) 
      } else { 
       f(user)(request) 
      } 
      } else { 
      Results.Redirect(routes.Auth.login()).withNewSession 
      } 
     } 
    ) 
    } 
    } 
} 

biscotti prodotti ogni 5min:

The cookies produced every 5min: 
Cookie:PS="a6bdf9df798c24a8836c2b2222ec1ea4a4251f301-username=admin&ts=1381180064" 
Cookie:PS="D7edg7df709b54B1537c2b9862dc2eaff40001c90-username=admin&ts=1381180380" 
+1

Riproduzione codifica cookie di sessione, quindi è sicuro includere la data/ora di scadenza. Lo stai facendo bene, non è necessario per la sessione lato server. – lambdas

+0

Sto pensando di fare lo stesso, ma vedo un difetto in questo. Cosa succede se la chiamata f (utente) (richiesta) ha già modificato la sessione? In questo caso, quando usi la sessione della richiesta come base per la modifica, perdi quella modifica, vero? – agabor

+0

Sono curioso: perché avresti bisogno della funzione "rollover"? Non sarebbe sufficiente aggiornare semplicemente il timestamp su ogni richiesta autenticata (ovviamente, se non è scaduta)? – Martin

risposta

2

mi sembra ragionevole, probabilmente messo serverside però, dare al cliente una "session-id" ed eliminare la sessione quando un utente si disconnette. Fare tutto il lato client significa che non c'è modo di invalidare la sessione se è stata rubata eccetto aspettare il timeout.

Problemi correlati