Memorizzazione della chiave di sessione in un campo nascosto

4

Sfondo:

Ho una domanda che è delineata in Usa diversi archivi locali tra le finestre . La domanda di livello molto alto è "Come posso evitare che le sessioni di schede e finestre si scontrino".

Requisiti:

Voglio poter avere "sessioni" separate per ciascuna (e) scheda (e) o finestra (e).

Problema:

Il problema è che se memorizzo i dati nei cookie o in HTML Local Storage, sarà molto difficile impedire all'utente di rovinare i dati aprendo la nuova finestra o scheda e mantenendo separati i dati.

Soluzione possibile:

Poiché Tab e Windows condividono i cookie e l'archiviazione locale HTML nella stessa istanza. La mia domanda a questo punto è: quanto è sicuro conservare una chiave univoca in un campo nascosto da utilizzare per recuperare i cookie o l'archiviazione locale HTML? In questo modo, se viene creata una nuova pagina (o scheda), questo campo non viene condiviso tra schede e finestre. Qual è il rischio per la sicurezza in questo approccio e la sua idea di good ?

Ad esempio, vorrei memorizzare l'ID di sessione o la chiave in un campo nascosto:

  <input type="hidden" name="sessionId" id="sessionId" value="" />
    
posta PhillyNJ 26.06.2015 - 17:56
fonte

2 risposte

3

I cookie sono principalmente attraenti grazie alla capacità di memorizzare valori longevi e alla convenienza di non dover inviare esplicitamente l'identificativo di sessione ad ogni richiesta (perché il browser ). Puoi anche nascondere facilmente i valori dei cookie dagli script, mentre la stessa protezione su un campo modulo o una variabile richiede una soluzione più dettagliata.

Tuttavia, dal momento che probabilmente creerai la tua libreria di gestione delle sessioni, dovrai essere a conoscenza di alcune cose, probabilmente più di quelle che ho elencato qui, ma come inizio, hai bisogno per proteggersi da:

  • ID di sessione prevedibili che possono consentire agli utenti di "trovare" e dirottare un altro
  • Consentire agli utenti di fornire il proprio ID sessione; solo gli ID generati dal server dovrebbero essere riconosciuti
  • Consentire agli script di vedere l'ID di sessione

Le prime due preoccupazioni si applicano a qualsiasi tipo di sessione. Sono notabili in gran parte perché probabilmente farai rotolare del codice di gestione delle sessioni personalizzato. La terza preoccupazione si applica molto di più-così , ma non esclusivamente, a sessioni di tipo cookieless, perché le intestazioni dei cookie possono essere contrassegnate come collegamento cookie.

Per impedire agli script di visualizzare un valore, devi chiudere l'ID con una certa cura:

var SessionScope = (function() {
  var o = {};

  // outside scripts can't see this:
  var session_id = '1234';

  // these methods can see session_id and use it to channel/sign requests
  o.get = function(url, data) { };
  o.post = function(url, data) { };
  o.whateverelse = function() { };

  return o;
})();

Per essere chiari, è idealmente necessario assicurarsi che SessionScope (o qualsiasi altra cosa) sia costruito in modo tale da non avere nemmeno legami con un costruttore che potrebbe essere toString() 'd.

Ora capisco il rischio che gli script vedano gli ID della sessione in abbastanza bassi nella maggior parte dei casi . Diventa più problematico quando si visualizzano i dati inviati da un utente a un altro utente o quando si incorporano librerie di terze parti non affidabili. Detto questo, se segui questa strada, è perfettamente fattibile per aggiungere la protezione aggiuntiva, quindi dovresti.

E ancora una volta, ti consigliamo di considerare che, se ti allontani dalla memorizzazione di ID di sessione nei cookie, probabilmente perderai o impedirai la possibilità di ricollegarti alla sessione senza chiedere all'utente di "trovarla" in alcuni modo.

Con tutto ciò detto, potresti non voler affatto "sessioni" distinte. La soluzione migliore potrebbe essere solo una singola sessione. Se il tuo utente ha effettuato l'accesso utilizzando le stesse credenziali e permessi in ogni scheda, e devi monitorare i dati relativi a una finestra, una scheda o una vista su entrambi i client e server , probabilmente vuoi solo una collezione nella sessione. Ma in quel tipo di soluzione, gli identificatori di vista / tab non sono solitamente necessari perché la vista è solo chiede cose rilevanti per se stesso.

Il cross-talk tra le schede e le viste viene evitato da una combinazione di che tiene le cose fuori dalla sessione "globale" che non appartengono a questo e che richiedono solo le cose che ti servono.

Tuttavia, se ciò non è fattibile per qualche motivo, potresti prendere in considerazione l'aggiunta di una raccolta di view collection al tuo modello di sessione e il passaggio di una percentuale di viewid . In questo caso, non dovresti preoccuparti di tutti i problemi di sicurezza relativi alla gestione e alla protezione delle chiavi di sessione (supponendo che tu stia utilizzando correttamente un sistema di sessione strong). Le chiavi di visualizzazione sarebbero rilevanti solo per la sessione, quindi una percentuale non rilevata diviewid non è pertinente per nessun altro e quindi non rappresenta una minaccia significativa.

    
risposta data 26.06.2015 - 22:22
fonte
0

Ci ho pensato un po 'per vedere quanto sarebbe complicato avere il nostro server web in grado di supportare più sessioni su più schede. Disclaimer Ho appena avuto un rapido brainstorming su questo argomento e non l'ho fatto in pratica, né ho nemmeno provato a implementare qualcosa di simile. Per sfruttare tutto ciò che i cookie fanno e non avere una riscrittura maggiore sui nostri client e server, volevo continuare a utilizzare i cookie per la gestione delle sessioni.

Per fare questo faremo percorsi URL univoci e fare in modo che quel cookie sia unico per quel percorso, la nostra applicazione è una singola pagina quindi sarebbe piuttosto banale aggiungere un finale / GUID / e ignorarlo semplicemente sul client e sul server. Le cose potrebbero complicarsi per le applicazioni multi pagina.

Modo precedente:

L'utente accede a mydomain / app / in due schede e il loro cookie di identificazione di sessione è condiviso tra tutte le schede.

Modo proposto:

L'utente passa a mydomain/app/ viene reindirizzato a mydomain/app/{GUID}/ con un percorso cookie di mydomain/app/{GUID}/ viene aperta una nuova scheda e vengono reindirizzati a mydomain/app/{NEXTGUID}/ con il percorso del cookie {NEXTGUID . Quando la scheda 1 comunica con il back-end che le schede cookie specifico è visibile solo al server e la stessa cosa con tab2. Il client non sa nulla del suo id di sessione e il server usa solo l'ID di sessione che viene dato, le singole o multiple schede tutto funziona allo stesso modo.

Risposta al commento

Non memorizzare la sessione nell'URL è una cattiva idea per motivi di sicurezza. Il guid renderebbe il percorso dei cookie unico per quella scheda, la chiave di sessione è ancora in ogni cookie. Il guid e l'id della sessione non sanno niente l'uno dell'altro. I cookie potrebbero e dovrebbero essere httponly e non disponibili per il client.

Penso che il vantaggio di questo approccio sia che il client non ha alcuna conoscenza su come gestire le sessioni (il browser invierà il cookie corretto e la sessione associata per quella scheda) e il server utilizzerà solo la sessione dal passato in richiesta. L'unica cosa che deve essere implementata sul server è aggiungere qualcosa all'URI per renderlo univoco per tab e fare in modo che il cookie di sessione usi quel uri quando si imposta il percorso sul cookie di sessione. Ciò consentirà anche ai client non basati su browser che non si preoccupano delle schede di avere una API pulita, hanno solo bisogno di inviare il cookie di sessione nell'intestazione del cookie.

    
risposta data 29.06.2015 - 18:36
fonte

Leggi altre domande sui tag